2011-09-06 47 views
8

可能重复:
What's the difference between encapsulating a private member as a property and defining a property without a private member?C#,物业之间的差异变和不变量

我知道属性和基本功能。但是当我纵深浏览文档时,我发现他们只是在获取集合并且没有变量的情况下声明的。

什么是这两个

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

public int EmpCode 
{ 
    get; 
    set; 
} 

之间的diffeence这是否只是一种书写的更简单的方法,其得到的.NET框架升级了。还是有任何功能差异?

回答

6

后来被称为自动属性,是same.They在C#3进行了介绍,你可以阅读更多关于他们在这里:http://trashvin.blogspot.com/2008/05/automatic-properties-and-object.html

简而言之,自动属性是语法糖,因此开发人员必须输入较少的代码,编译器会为你生成私有字段和公共setter和getter。

+0

这是适用于所有数据类型的缩写吗? –

+0

@Nithesh Hebri - 事实确实如此。 –

+0

它包含在.net framework 3.5中? –

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; } } 
} 
+1

没有功能差异,但是如果你要序列化自动道具,你会得到令人困惑的名字作为后备字段,这可能是非常烦人的 – vittore

0

这就是所谓的自动性能和仅仅是一个,如果将它们写的更简单的方法你不需要任何财产内的逻辑。编译时,编译器会为属性自动生成一个支持变量,因此它完全一样。

可以很容易地将财产转为与支持字段和一些逻辑属性以后,这将突破依赖于该财产的任何代码,如果你不是仅仅使用了公共领域的第一,然后改它成为一个属性,你会打破依赖此字段/属性的代码。

+0

这是适用于所有数据类型的简写形式吗? –

+0

@Nithesh Hebri - 事实确实如此。 –

0

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

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

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

0

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

大多数时候你并不关心,但是在使用序列化/反序列化在层之间传递对象的情况下,在某些情况下,您会显式创建后台字段,以便除去__propBackingField2735t34上的名称客户。

另外,在显式编码特性进行验证一些逻辑可以包括其不是,私人支持字段被自动创建的autoproperites

0

这是从C#3.0增强其被称为自动实现的属性的情况下编译器在后台