为什么我应该使用自动实现的属性而不是字段?
在这两者之间:
有财产:
class WithProperty { public string MyString {get; set;} }
有了字段:
class WithField { public string MyString; }
显然我应该选择第一个。 为什么?
我听说过这里的观点是允许接口更改,但如果我有第二个,并将其更改为第一个,则不需要更改其他代码。 重新编译时,所有内容都将指向该属性。
我错过了一些重要的东西吗?
最重要的区别在于,如果您使用字段,以后需要将其更改为属性(例如,强制执行某些validation),则需要重新编译调用代码的所有库。 如果名称保持不变,您可以编译完全相同的代码 – 但代码的使用者仍然需要重新编译。 这是因为在字段和属性之间生成的用于获取值的IL是不同的。 如果它已经是属性,则可以在不强制代码的消费者进行更改的情况下进行更改。
这对您来说可能是也可能不是问题。 但该属性的代码量几乎相同,被认为是最佳实践。 我会一直去找房产。
如果您需要在不破坏其他程序集的情况下添加validation或其他逻辑,则可以稍后更改该属性。
此外,该属性可以与数据绑定一起使用。
你缺少的重要部分是这个陈述的严重性:
重新编译时
当您的代码指向某个字段并将其更改为指向同名属性时,C#本身不会更改,但生成的IL会更改 – 它会根据需要生成对getter或setter的方法调用。
并非每个应用程序都包含在单个分布式单元中的所有部分。 许多应用程序依赖于可插拔性/可扩展性的接口。 如果您的应用程序具有字段的接口,并且您希望将其更改为属性以利用属性的强大function,则必须重新编译和重新分发应用程序。 你最好还是把它作为一个属性。
使用属性,您可以轻松扩展它以包含新逻辑。
例如,如果需要向set
添加validation逻辑。
本文介绍了您应该选择属性的其他几个原因:
http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx