封装像这样的私有成员之间有什么区别(性能,内存......等)
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
并定义像这样的属性
public int Age
{
get ;
set ;
}
答案 0 :(得分:11)
在第二种情况下,C#编译器将为您生成一个字段,并生成一个getter和setter来访问它。换句话说,您发布的两个代码示例之间没有功能差异。唯一的区别是私有字段的名称,它将由编译器生成。
答案 1 :(得分:6)
C#编译器为auto-implemented properties生成的代码几乎与您的第一个示例相同(它使用私有的支持字段),所以我不会太担心它
唯一真正的区别在于它使用[CompilerGenerated]
属性修饰属性getter和setter。这不应该对获取和设置属性的性能产生任何影响。 (作为一个小的挑剔,这应该稍微增加程序集的二进制文件的大小)。
我喜欢自动实现的属性,除了简洁之外,它甚至可以防止声明类型访问后备字段而不是属性(后备字段是匿名的)。这使代码更加清晰,并且通常也可以更轻松地重构/更改属性实现。
答案 2 :(得分:1)
我刚才问过这个问题:
请参阅Correct use of C# properties
引用答案:
它们在内部编译形式中是等效的,除了您不能以第二种形式访问编译器生成的私有变量。
从代码效率的角度来看,它们也是等价的,即时编译器通常直接访问私有变量而没有调用访问函数的开销(在运行时环境检查了可访问性等之后) 。)。从编码的角度来看,我更喜欢第二个版本,它更紧凑(写入更少,阅读量更少)。
第二种语法在C#中引入3.0。因此,第一个变体将与旧编译器更兼容。
答案 3 :(得分:1)
不同之处在于您可以控制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);
}
如果您不需要,自动实现就足够了。
与字段相比,使用自动属性实现的主要优点是,当您使用自动属性实现时,稍后您希望将实现更改为例如如上所述,你班级的界面不会改变。
答案 4 :(得分:1)
与第二种情况下的表现相比没有区别是用于书写属性的合成糖,称为自动属性。
如果您想在集合或部分中添加一些逻辑,您将无法自动执行此属性。