可能重复:
Should I use public properties and private fields or public fields for data?
Difference between Automatic Properties and public field in C# 3.0
人们似乎教条地坚持在田野上使用公共财产,但为什么在简单财产的情况下它是如此重要?
怎么样
public int Foo { get; set; }
与
非常不同public int Foo;
在我的脑海中,我可以想到两者之间的实际差异:
除了这些非常罕见的情况之外,稍后将Foo更改为计算属性会导致0行代码更改。
答案 0 :(得分:56)
使用属性有几个明显的优点:
此外,几乎没有缺点。像这样的简单自动属性由JIT编译器内联,因此没有理由不使用它们。
另外,你提到了:
除了这些非常罕见的情况之外,稍后将Foo更改为计算属性会导致0行代码更改。
这不需要更改代码,但它会强制您重新编译所有代码。从字段更改为属性是一个重大的API更改,这将需要重新编译引用程序集的任何程序集。通过使其成为自动属性,您可以发布新的二进制文件,并保持API兼容性。这是我上面提到的“版本化”优势......
答案 1 :(得分:44)
一个很好的理由是你可以改变获取/设置的可访问性。
public int Foo {get; protected set;}
答案 2 :(得分:26)
属性是一种语言元素,它在逻辑上表示由类建模的事物的属性。汽车模型车;颜色是汽车的财产;因此,颜色是汽车的财产。
字段是一种语言元素,表示类的实现细节。您的汽车没有“颜色区域”,因此您的程序代表汽车不应该暴露一个名为Color的字段。它可能包含私有实现细节,其中属性Color由字段实现,但这是私有实现细节,而不是模型的公共可访问部分。
答案 3 :(得分:6)
您可以使属性成为虚拟属性,并在派生类中覆盖它们的实现。这是许多库中的一个重要因素,它们将对象包装在生成的代理类中,例如: NHibernate实现延迟加载的方式。这在字段上是不可能的。
答案 4 :(得分:5)
主要是因为惯例。
一个坚实的论据是,如果您以后需要从字段更改为属性,则需要重新编译引用您的所有程序集。
反思确实偶尔出现,但非常罕见。某些序列化类型基于属性。