为什么在C#中使用简单属性而不是字段?


Why use simple properties instead of fields in C#?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Should I use public properties and private fields or public fields for data?
Difference between Automatic Properties and public field in C# 3.0

人们似乎固执己见地坚持在土地上使用公共财产,但为什么在简单财产的情况下如此重要?

如何

1
public int Foo { get; set; }

与…大不相同

1
public int Foo;

从我的头脑中,我能想到这两者之间的一些实际差异:

  • 使用反射访问成员(很少,而且大多数合适的反射算法将解释差异)
  • 第二个条目允许您使用字段作为ref和out参数的有效参数,这似乎是使用字段版本的优势。
  • 字段在远程处理中不起作用(可能,我从未使用过远程处理,但我想它们不会)?

除了这些非常罕见的情况外,将foo更改为计算属性之后会导致0行代码发生更改。


使用属性有两个明显的优势:

  • 如果以后需要额外的逻辑,它允许版本控制。向getter或setter添加逻辑不会破坏现有代码。
  • 它允许数据绑定正常工作(大多数数据绑定框架不与字段一起工作)。

此外,几乎没有缺点。像这样简单的自动属性是由JIT编译器内联的,因此没有理由不使用它们。

此外,您还提到:

Other than these fairly rare cases, changing Foo to be a computed property later results in 0 lines of code changed.

这不需要更改代码,但它确实强制您重新编译所有代码。从字段更改为属性是一个破坏性的API更改,它将要求重新编译引用程序集的任何程序集。通过使其成为一个自动属性,您可以只发送一个新的二进制文件,并保持API的兼容性。这就是我上面提到的"版本控制"优势…


一个很好的原因是您可以改变get/set的可访问性。

1
public int Foo {get; protected set;}


属性是一种语言元素,逻辑上表示由类建模的对象的属性。阶级汽车是汽车的模型;颜色是汽车的属性;因此,颜色是汽车的属性。

字段是表示类的实现细节的语言元素。您的汽车没有"颜色字段",因此程序对汽车的表示不应公开一个名为"颜色"的字段。它可能包含私有实现细节,其中属性颜色由字段实现,但这是私有实现细节,而不是模型的公共可访问部分。


您可以使属性成为虚拟的,并在派生类中重写它们的实现。在许多将对象包装在生成的代理类中的库中,这是一个重要因素,例如nhibernate实现延迟加载的方式。这在野外是不可能的。


主要是因为惯例。

唯一可靠的理由是,如果以后需要从字段更改为属性,则需要重新编译引用您的所有程序集。

偶尔也会有反省,但很少。某些序列化类型基于属性。