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

时间:2010-07-07 20:14:58

标签: c# .net

在这两者之间:

有财产:

class WithProperty
{
    public string MyString {get; set;}
}

使用字段:

class WithField
{
    public string MyString;
}

显然我应该选择第一个。为什么呢?

我听说过这里的观点是允许界面更改,但是 如果我有第二个,并将其更改为第一个,则不应该有其他代码 永远不得不改变。重新编译时,所有内容都只是指向 财产而不是。

我错过了一些重要的事情吗?

5 个答案:

答案 0 :(得分:19)

最重要的区别在于,如果您使用字段,以后需要将其更改为属性(例如,强制执行某些验证),则需要重新编译调用代码的所有库。如果名称保持不变,您可以编译完全相同的代码 - 但代码的使用者仍然需要重新编译。这是因为在字段和属性之间生成的用于获取值的IL是不同的。如果它已经是属性,您可以进行更改,而不必强迫代码的消费者进行更改。

这对您来说可能是也可能不是问题。但该属性的代码量几乎相同,被认为是最佳实践。我总是去找房子。

答案 1 :(得分:9)

如果您需要在不破坏其他程序集的情况下添加验证或其他逻辑,则可以稍后更改该属性。

此外,该属性可与数据绑定一起使用。

答案 2 :(得分:2)

你缺少的重要部分是这句话的严重性:

  

重新编译时

当您的代码指向某个字段并将其更改为指向同名属性时,C#本身不会更改,但生成的IL会更改 - 它会根据需要生成对getter或setter的方法调用

并非每个应用程序都包含在单个分布式单元中的所有部分。许多应用依赖于可插拔性/可扩展性的接口。如果您的应用程序具有字段的接口,并且您希望将其更改为属性以利用属性的强大功能,则必须重新编译和重新分发应用程序。你最好还是把它作为一个属性。

答案 3 :(得分:0)

使用属性,您可以轻松扩展以包含新逻辑。

例如,如果您需要将验证逻辑添加到set

答案 4 :(得分:0)

本文介绍了您应该选择属性的其他几个原因:

  

http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx