【问题标题】:Why should I use an automatically implemented property instead of a field?为什么我应该使用自动实现的属性而不是字段?
【发布时间】:2010-07-07 20:14:57
【问题描述】:

在这两者之间:

带属性:

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

带字段:

class WithField
{
    public string MyString;
}

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

我听说这里的重点是允许界面更改,但是 如果我有第二个,并将其更改为第一个,则不应使用其他代码 必须改变。重新编译时,一切都将指向 属性。

我在这里遗漏了什么重要的东西吗?

【问题讨论】:

标签: c# .net


【解决方案1】:

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

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

【讨论】:

  • 我也是。我只是不喜欢在不理解为什么的情况下跟随“人群在做什么”:)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您缺少的重要部分是此陈述的重要性:

    重新编译时

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

    并非每个应用程序的所有部分都包含在一个分布式单元中。许多应用程序依赖于接口来实现可插入性/可扩展性。如果您有一个带有字段接口的应用程序,并且您想将其更改为属性以利用属性的强大功能,则必须重新编译和重新分发该应用程序。您不妨一开始就将其设为属性。

    【讨论】:

      【解决方案4】:

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

      例如,如果您需要在set 中添加验证逻辑。

      【讨论】:

      • 是的,但我可以像使用字段一样简单地做到这一点。将属性转换为字段并不是对任何调用代码的语法更改。如果我需要那个逻辑,我明白它需要成为一个属性。我问的是我不知道的情况。
      【解决方案5】:

      本文探讨了为什么您应该更喜欢属性的其他几个原因:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-13
        • 2011-12-28
        • 2018-06-10
        • 2011-01-11
        • 1970-01-01
        • 2018-11-25
        • 2016-05-23
        • 2013-05-12
        相关资源
        最近更新 更多