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

时间:2010-03-03 19:45:43

标签: c#

  

可能重复:
  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;

在我的脑海中,我可以想到两者之间的实际差异:

  • 使用反射访问会员(罕见,最体面的反射算法将解释差异)
  • 第二个条目允许您将该字段用作ref和out参数的有效参数,这似乎是使用字段版本的一个优势
  • 字段在Remoting中不起作用(可能,我从未使用过远程处理,但我想他们不会)

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

5 个答案:

答案 0 :(得分:56)

使用属性有几个明显的优点:

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

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

另外,你提到了:

  

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

这不需要更改代码,但它会强制您重新编译所有代码。从字段更改为属性是一个重大的API更改,这将需要重新编译引用程序集的任何程序集。通过使其成为自动属性,您可以发布新的二进制文件,并保持API兼容性。这是我上面提到的“版本化”优势......

答案 1 :(得分:44)

一个很好的理由是你可以改变获取/设置的可访问性。

public int Foo {get; protected set;}

答案 2 :(得分:26)

属性是一种语言元素,它在逻辑上表示由类建模的事物的属性。汽车模型车;颜色是汽车的财产;因此,颜色是汽车的财产。

字段是一种语言元素,表示的实现细节。您的汽车没有“颜色区域”,因此您的程序代表汽车不应该暴露一个名为Color的字段。它可能包含私有实现细节,其中属性Color由字段实现,但这是私有实现细节,而不是模型的公共可访问部分。

答案 3 :(得分:6)

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

答案 4 :(得分:5)

主要是因为惯例。

一个坚实的论据是,如果您以后需要从字段更改为属性,则需要重新编译引用您的所有程序集。

反思确实偶尔出现,但非常罕见。某些序列化类型基于属性。