为什么我应该使用自动实现的属性而不是字段?

在这两者之间:

有财产:

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