C#,属性与变量和无变量之间的差异

时间:2011-09-06 05:27:40

标签: c# properties automatic-properties

  

可能重复:
  What's the difference between encapsulating a private member as a property and defining a property without a private member?

我知道属性的基本功能。但是当我深入阅读文档时,我发现它们只是在get set和没有变量的情况下被声明。

这两者之间的差异是什么

public int EmpCode
{
    get { return _strEmpCode; }
    set { _strEmpCode = value; }
}  

public int EmpCode
{
    get; 
    set; 
}  

这是一种更简单的写作方式,因为.net框架升级了。或者有任何功能差异吗?

6 个答案:

答案 0 :(得分:6)

后者被称为自动属性并且是相同的。它们是在C#3中介绍的,您可以在这里阅读更多相关信息:http://trashvin.blogspot.com/2008/05/automatic-properties-and-object.html

简单地说,自动属性是语法糖,因此开发人员必须输入更少的代码,编译器将为您生成私有字段和公共setter和getter。

答案 1 :(得分:3)

这称为自动属性。没有功能差异。后一种语法只是前者的简写。

C# specification的第10.7.3节提供了更多细节:

  

当属性被指定为自动实现的属性时,隐藏的后备字段将自动可用于该属性,并且实现访问器以读取和写入该后备字段。

     

以下示例:

public class Point {
   public int X { get; set; } // automatically implemented
   public int Y { get; set; } // automatically implemented
}
  

等同于以下声明:

public class Point {
   private int x;
   private int y;
   public int X { get { return x; } set { x = value; } }
   public int Y { get { return y; } set { y = value; } }
}

答案 2 :(得分:0)

它叫做自动属性,如果你不需要属性中的任何逻辑,它只是一种更简单的编写方式。编译时,编译器将自动生成属性的后备变量,因此它完全相同。

很容易将属性更改为具有后备字段的属性以及稍后的某些逻辑,并且会破坏依赖于此属性的任何代码,如果您只是先使用公共字段,然后将其更改为属性,您将破坏依赖此字段/属性的代码。

答案 3 :(得分:0)

没有这样的功能差异..但如果你想在你的属性设置/获取更多功能,你可以使用带有私有变量的版本..

    public int EmpCode
    {
        get { return _strEmpCode > 0 ? 100 + _strEmpCode : 0; }
        set
        {
            if (value > 0)
                _strEmpCode = value;
        }
    }

否则,您可以简单地使用没有私有变量的版本。

答案 4 :(得分:0)

第二种方式实际上是auto-property,隐含地实现了后备字段,这意味着你不能影响生成的字段名称。

大多数情况下你并不关心,但是在使用序列化/反序列化在层之间传递对象的情况下,在某些情况下你会明确地创建支持字段,以便摆脱__propBackingField2735t34之类的客户名称。

同样在明确编码的属性中,可以包含一些验证逻辑,而autoproperites不是这种情况

答案 5 :(得分:0)

这是C#3.0的增强功能,被称为自动实现的属性,编译器在后台自动创建私有支持字段