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;,而不需要进行其他更改。我能想到的最好的方法是,属性语法感觉更好,但我几乎不能用这个理由说服别人。
在这种情况下,使用属性语法有什么好处(如果有的话)?
- stackoverflow.com/questions/1876197/…
- 看看乔恩·斯基特对你复制的问题的回答。
- stackoverflow.com/questions/1180860/…
- stackoverflow.com/questions/480627/…
- stackoverflow.com/questions/1277572/…
- 投票结束我自己,抱歉。
主要优点是:
未来验证您的API-如果您以后需要getter或setter中的逻辑,您的公共API不会改变。
数据绑定-大多数数据绑定框架只针对属性,而不是字段。
- 另外,您不能在接口上声明字段。
- 对于1,API是否保持不变?外部开发者仍然会编写x.Foo = bar,不管Foo是字段还是属性。2是有道理的。
- 我要加3。对象关系映射-大多数框架都针对属性工作。
- @马修,明天你决定让塞特人保密。
- @从C的角度来看,Matthew的语法是相同的,但是IL是完全不同的:属性get被重写为对方法get_Foo()的调用。
- @马修,这是一个突破性的改变。您需要重新编译,其中自动属性到具有自定义实现的属性可以直接交换程序集。
- @安德烈:当然可以,但无论是使用字段还是使用带有公共setter的属性,都存在这个问题。我同意使用字段不是正确的解决方案,但我不认为这是原因之一。
- @里德普西:谢谢,这是有道理的。
- @在这种情况下,我不认为这是真的:"编译器将内联不包含字段访问以外指令的非虚拟属性getter或setter"dotnet.sys-con.com/node/46342
- @Matthew使用哪个编译器,C编译器还是抖动?我相信这是抖动,这意味着IL将显示对get_Foo()的呼叫。
- @啊,谢谢你的澄清。这也回答了我关于突破性变化的问题,我很困惑,如果它是相同的IL,它怎么可能是突破性变化。
我们不使用自动实现属性的主要原因是那些序列化成员而不是属性的序列化机制(例如.NET远程处理的二进制序列化)。
在这种情况下,如果有两个应用程序分别编译同一个类并交换该类的序列化副本,则无法保证它将正确反序列化,因为您无法控制私有成员的名称。
我不相信它们会编译到相同的IL,因为get和set for属性实际上是IL级别上的函数,并且在处理反射时也是如此。但有一些原因可以这样做:
反思!
序列化/反序列化仅对公共属性有效,而不是对公共字段有效。
调试时,您可以在get或set上设置断点,这有助于跟踪访问变量的时间,特别是当您看到一个愚蠢的值并且不知道它来自何处时。
赞成的意见
欺骗
- 不能在set/get内设置EDOCX1[0]
- 在get/set中不能有代码
- 不处理WPF数据绑定
- 没有一个概念能像default value那样代表地产,因为它背后没有default field。
正反两方面都与项目的实施有着严格的关系。
只是一些提示,很肯定其他人会添加其他东西…