public int Age { get; set; }
OR
public int Age;
在Main内部,如果我创建这个新Person。以上两条线是完全相同的正确吗?
答案 0 :(得分:10)
不正确。第一行是自动实现的属性,第二行是公共字段。它们既不是二进制兼容的,也不是语义上完全相同的。通常,属性因其灵活性和可以用于封装数据(尽管它们经常被滥用)这一事实而受到欢迎。
但就编译器生成的内容而言,该属性创建了一个自动备份字段,实质上是两个方法(“getter”和“setter”)来访问它。这个领域就是:一个领域。
由于存在这些差异,实际上您的两个示例的行为方式有很多种不同:
ref
或out
参数访问,例如Interlocked
方法之一。int
您有一个可变值类型(例如Point
),则该属性不允许您直接修改该值,因为它将返回该字段的副本。 (要修改字段,您需要将属性返回的值分配给局部变量,修改本地,然后将其分配回属性。)该字段实际上允许您正确地修改该值。 / LI>
醇>
作为旁注,上面的第3点是许多开发人员用来反对曾经设计可变值类型的行为类型的示例。
答案 1 :(得分:1)
不 - 第一个是字段,第二个是属性。尽可能使用属性,以便稍后扩展它们,即在setter中添加一些数据验证。属性使用支持字段,自动属性只是为您隐藏。
这是属性设置器中的数据验证示例:
private int _age;
public int Age
{ get { return _age; }
set { if(value < 200) _age = value;}
}
使用属性而不是字段的主要原因之一是对应用程序或库进行版本控制 - 如果使用属性,则可以更改属性实现,而无需要求类或库的用户重新编译其代码,你班级的公共界面保持不变。另一方面,稍后从一个字段转到一个属性最坏的情况可能是一个突破性的变化(参见Dao的列表,使用一个字段作为ref),并且至少需要重新编译。
答案 2 :(得分:0)
不,他们不一样。
第一个是属性,这意味着将为您创建另一个支持变量,以及getter和setter方法。这些将是看不见的。您应该使用此方法,因为您可以轻松更改getter和setter类的功能(尽管在Visual Studio中,将字段转换为属性非常简单。)
第二个只是一个对所有人公开的成员变量,这是一个坏主意,因为它破坏了封装。
答案 3 :(得分:0)
只是为了给出一个不同的实际例子,第二个版本不会被序列化或数据绑定到控件,而第一个版本可以。 This bit me on the ass before.
答案 4 :(得分:0)
第一个是自动属性,第二个是“大写”成员变量。封装有利于第一个。在第一种情况下,设置和获取有代码点,尽管是空的。