封装私有成员作为一个属性和定义一个没有私有成员的属性之间有什么区别?
封装一个私人成员之间有什么区别(性能,内存…等)
private int age; public int Age { get { return age; } set { age = value; } }
并定义一个像这样的属性
public int Age { get ; set ; }
C#编译器为自动实现的属性生成的代码与您的第一个示例(它使用私有的支持字段) 几乎相同,所以我不会担心它太多。
唯一真正的区别是它用[CompilerGenerated]
属性来装饰属性getter和setter。 这不应该对获取和设置财产的performance产生任何影响。 (作为一个小小挑逗,这应该会增加程序集的大小)。
除了简洁之外,我喜欢自动实现的属性,它甚至可以防止声明types访问后台字段而不是属性(后台字段是匿名的)。 这给代码带来了清晰,并且通常也使重构/更改属性实现变得更容易。
在第二种情况下,C#编译器将为您生成一个字段并生成一个getter和setter来访问它。 换句话说,您发布的两个代码示例之间没有function差异。 唯一的区别将是私有字段的名称,这是编译器生成的。
前一阵子我问了这个问题:
请参阅正确使用C#属性
引用答案:
它们在内部编译的表单中是等价的,不同之处在于不能以第二种forms访问编译器生成的私有variables。
从代码效率的angular度来看,它们也是等价的,即时编译器通常直接访问私有variables,而不用调用访问函数(在运行时环境检查了可访问性等)之后。
从编码的angular度来看,我更喜欢第二个版本更紧凑(less写,less读)。
第二种语法是在C#3.0中引入的。 所以第一个变体会和旧编译器更兼容。
不同之处在于你可以控制getter和setter。
随着自动执行,你不能做这样的事情:
private int age; public int Age { get { return age; } set { if (age != value) { age = value; OnAgeChanged(EventArgs.Empty); } } } public event EventHandler AgeChanged; protected virtual void OnAgeChanged(EventArgs e) { var handler = AgeChanged; if (handler != null) handler(this, e); }
如果你不需要这个,自动执行就够了。
与使用自动属性实现相比,字段的主要优点是,当您使用自动属性实现,然后想要将实现更改为上述内容时,类的接口不会更改。
与第二种情况下的性能相比,没有任何区别是用于写入属性的合成糖,称为自动属性。
如果你想把一些逻辑放在集合中或者得到一部分,你将无法做到自动属性。