C#,物业之间的差异变和不变量
可能重复:
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框架升级了。还是有任何功能差异?
后来被称为自动属性,是same.They在C#3进行了介绍,你可以阅读更多关于他们在这里:http://trashvin.blogspot.com/2008/05/automatic-properties-and-object.html
简而言之,自动属性是语法糖,因此开发人员必须输入较少的代码,编译器会为你生成私有字段和公共setter和getter。
这被称为自动属性。没有功能差异。后者的语法只是前者的缩写。
的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; } }
}
没有功能差异,但是如果你要序列化自动道具,你会得到令人困惑的名字作为后备字段,这可能是非常烦人的 – vittore
这就是所谓的自动性能和仅仅是一个,如果将它们写的更简单的方法你不需要任何财产内的逻辑。编译时,编译器会为属性自动生成一个支持变量,因此它完全一样。
可以很容易地将财产转为与支持字段和一些逻辑属性以后,这将不突破依赖于该财产的任何代码,如果你不是仅仅使用了公共领域的第一,然后改它成为一个属性,你会打破依赖此字段/属性的代码。
这是适用于所有数据类型的简写形式吗? –
@Nithesh Hebri - 事实确实如此。 –
有这样功能没有差异..但是如果你想要更多的功能在你的属性设置/让你可以使用与私有变量版本..
public int EmpCode
{
get { return _strEmpCode > 0 ? 100 + _strEmpCode : 0; }
set
{
if (value > 0)
_strEmpCode = value;
}
}
否则,你可以简单地使用版本没有私有变量。
第二种方式实际上是auto-property,它隐含地实现了后台字段,这意味着你不能影响生成的字段名称。
大多数时候你并不关心,但是在使用序列化/反序列化在层之间传递对象的情况下,在某些情况下,您会显式创建后台字段,以便除去__propBackingField2735t34
上的名称客户。
另外,在显式编码特性进行验证一些逻辑可以包括其不是,私人支持字段被自动创建的autoproperites
这是从C#3.0增强其被称为自动实现的属性的情况下编译器在后台
这是适用于所有数据类型的缩写吗? –
@Nithesh Hebri - 事实确实如此。 –
它包含在.net framework 3.5中? –