c# - (私有静态引用与私有引用)性能
问题描述
好的,假设我们有一个生产对象实例的工厂。该工厂生成的实例依赖于一个引用。
我试图了解在对象中将此引用声明为私有或私有静态是否有任何区别。C# 在幕后做什么。以数据存储方式声明引用静态是否更有效。
示例代码:
所以我们在谈论这个
public class ShoesFactory {
public ShoesFactory(Material soleMaterial){ // contractor
ShoesOfTypeA.SetSoleMaterial(soleMaterial)
}
public ShoesOfTypeA GetShoesOfTypeA() {
return new ShoesOfTypeA ();
}
}
public class ShoesOfTypeA {
private static Material soleMaterial;
public static SetSoleMaterial(soleMaterial){
ShoesOfTypeA.soleMaterial = soleMaterial;
}
}
对比这个
public class ShoesFactory {
private Material soleMaterial;
public ShoesFactory(Material soleMaterial){ // contractor
this.soleMaterial=soleMaterial;
}
public ShoesOfTypeA GetShoesOfTypeA() {
return new ShoesOfTypeA (soleMaterial);
}
}
public class ShoesOfTypeA {
private Material soleMaterial;
public ShoesOfTypeA(soleMaterial) { //constructor
this.soleMaterial = soleMaterial;
}
}
编辑:正如 John Alexiou 在评论中所说,在不同类的构造函数上初始化字段违反了封装原则,因此我们将初始化移出承包商
这里的问题不是关于如何遵循 SOLID 设计原则,而是上述代码的性能差异是什么:)
解决方案
您的问题不是性能,而是此时的设计。
我建议你有一个Shoe
带有指定鞋子类型的属性的类,以及一个生成鞋子的工厂方法。此外,可以使用字段按需读取材料,该Lazy<Material>
字段在首次访问时调用某些方法(委托)。
class Program
{
static void Main(string[] args)
{
var factory = new ShoeFactory(ReadMaterial);
var b = factory.GetShoesOfType(ShoeType.B);
}
static Material ReadMaterial()
{
return new Material();
}
}
public class Material
{
}
public enum ShoeType
{
A,
B,
C
}
public sealed class Shoe
{
public Shoe(Material material, ShoeType type)
{
Material=material;
Type=type;
}
public Material Material { get; }
public ShoeType Type { get; }
}
public class ShoeFactory
{
private readonly Lazy<Material> soleMaterial;
public ShoeFactory(Func<Material> materialFactory)
{
this.soleMaterial=new Lazy<Material>(materialFactory);
}
public Shoe GetShoesOfType(ShoeType type)
{
return new Shoe(soleMaterial.Value, type);
}
}
上面的设计是直接的、灵活的,如果你要问我关于性能的问题,就像任何其他现代应用程序一样,最慢的部分是初始化类,并且通过保持类结构简单,你可以帮助编译器自行进行适当的优化。
推荐阅读
- swiftui - SwiftUI 中的 ForEach 循环仅在数组中显示第一个
- r - 序列向量的转角:复平面
- ios - 标签的 UICollectionViewCell 问题
- java - java.lang.IllegalArgumentException:服务未注册:lt@2178976
- pine-script - 在松树脚本上突出显示接近移动平均线的蜡烛
- python - 数据编辑/访问的 Pandas Multiindex 行
- java - Java 中 wait() 和 notifyAll() 的行为?
- go - 迭代接口映射的值
- html - 如何将 div 的高度设置为外部 div 的 100% 高度?
- swift - 如何在 IntentConfiguration Widget 视图 iOS 14 中显示与 CoreData 中同一行相关的数据?