关于c#:使用默认访问的自动实现属性而不是使用公共字段有什么好处?

What is the advantage of using auto-implemented properties with the default access, instead of using public fields?

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

Possible Duplicate:
C#: Public Fields versus Automatic Properties
Do I need to use { get; set; } with c# fields that have no special actions when getting and setting

考虑这两个选项:

1
2
3
public int Foo { get; set; }

public int Foo;

它们在语义上似乎是等价的,我相信它们甚至可以编译成相同的IL。那么使用这个属性有什么好处呢?看到公共字段让我感到不安,但我想不出使用属性语法有什么具体的好处。如果将来需要一个显式的getter和setter,则可以用public int Foo { ... }替换public int Foo;,而不需要进行其他更改。我能想到的最好的方法是,属性语法感觉更好,但我几乎不能用这个理由说服别人。

在这种情况下,使用属性语法有什么好处(如果有的话)?


主要优点是:

  • 未来验证您的API-如果您以后需要getter或setter中的逻辑,您的公共API不会改变。
  • 数据绑定-大多数数据绑定框架只针对属性,而不是字段。

  • 我们不使用自动实现属性的主要原因是那些序列化成员而不是属性的序列化机制(例如.NET远程处理的二进制序列化)。

    在这种情况下,如果有两个应用程序分别编译同一个类并交换该类的序列化副本,则无法保证它将正确反序列化,因为您无法控制私有成员的名称。


    我不相信它们会编译到相同的IL,因为get和set for属性实际上是IL级别上的函数,并且在处理反射时也是如此。但有一些原因可以这样做:

  • 反思!
  • 序列化/反序列化仅对公共属性有效,而不是对公共字段有效。
  • 调试时,您可以在get或set上设置断点,这有助于跟踪访问变量的时间,特别是当您看到一个愚蠢的值并且不知道它来自何处时。

  • 赞成的意见

    • 轻松申报

    欺骗

    • 不能在set/get内设置EDOCX1[0]
    • 在get/set中不能有代码
    • 不处理WPF数据绑定
    • 没有一个概念能像default value那样代表地产,因为它背后没有default field

    正反两方面都与项目的实施有着严格的关系。

    只是一些提示,很肯定其他人会添加其他东西…