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