2010-11-24 46 views
11

什么是封装的私有成员这样将私有成员封装为属性并定义没有私有成员的属性之间有什么区别?

private int age; 
public int Age 
{ 
    get { return age; } 
    set { age = value; } 
} 

和定义属性这样

public int Age 
{ 
    get ; 
    set ; 
} 
+0

相关问题:http://stackoverflow.com/questions/1294660/c-automatic-properties – 2010-11-24 13:15:36

+0

也http://stackoverflow.com/questions/3532038/correct-use-of-c-properties – Nobody 2010-11-24 13:17:33

回答

5

,在C#编译器生成auto-implemented properties的代码之间的差异(性能,内存...等)是差不多相同于你的第一个例子(它使用私人支持领域),所以我不会担心它太多。

只有真正的区别在于它用[CompilerGenerated]属性来装饰属性获取器和设置器。这不应该对获取和设置财产的表现产生任何影响。 (作为一个小小挑逗,这应该会稍微增加程序集的二进制大小)。

除了简洁性之外,我喜欢自动实现的属性,它甚至可以防止声明类型访问后台字段而不是属性(后台字段是匿名)。这为代码带来了清晰度,并且通常也使重构/更改属性实现变得更简单。

+1

它不是唯一的区别是:属性后台字段不能标记为“只读”,而显式字段可以。 – 2010-11-24 15:01:42

+0

@ Paul Ruane:的确如此,但我正在谈论OP提供的两个样本之间的差异。 – Ani 2010-11-24 15:06:08

11

在第二种情况下,C#编译器将为您生成一个字段并生成一个getter和setter来访问它。换句话说,您发布的两个代码示例之间没有功能差异。唯一的区别将是私有字段的名称,这是编译器生成的。

1

我刚才问这个问题:

看到Correct use of C# properties

引用答案:

他们是在内部编译形式等价的,不过你不能访问编译器生成的私人以第二种形式变量。


从代码效率的角度来看,它们也是等价的,即时编译器通常直接访问私有变量而无需调用访问函数的开销(在运行时环境检查到可访问性之后等)。

从编码的角度来看,我更喜欢第二个版本更紧凑(少写,少读)。

第二种语法是在C#3.0中引入的。因此,第一个变体将与旧编译器更兼容。

1

不同之处在于你可以控制获取者和设置者。

随着自动执行,你不能这样做:

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); 
} 

如果你不需要这些,自动实现应该是足够的。

与使用自动属性实现与字段相比,主要优势在于,当您使用自动属性实现时,稍后想要将实现更改为以上,你班级的界面不会改变。

1

与第二种情况下的性能相比,没有区别是合成糖用于编写称为自动属性的属性。

如果你想放置一些逻辑或获得部分,你将无法做到它的自动属性。