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

时间:2010-11-24 13:12:02

标签: c# performance memory properties

封装像这样的私有成员之间有什么区别(性能,内存......等)

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

并定义像这样的属性

public int Age
{
  get ;
  set ;
}

5 个答案:

答案 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)

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

如果您想在集合或部分中添加一些逻辑,您将无法自动执行此属性。