【问题标题】:C# 3.0 Autoproperties - whats the difference?C# 3.0 自动属性 ​​- 有什么区别?
【发布时间】:2009-03-17 10:29:29
【问题描述】:

0 下面有什么区别?

public class MyClass
{
    public bool MyProperty;
}

public class MyClass
{
    public bool MyProperty { get; set; }
}

仅仅是语义吗?

【问题讨论】:

    标签: syntax c#-3.0


    【解决方案1】:

    字段和属性除了语义之外还有很多不同。

    1. 可以覆盖属性以在后代中提供不同的实现。
    2. 属性可以帮助缓解版本控制问题。 IE。将字段更改为库中的属性需要根据该库重新编译任何内容。
    3. 属性对于 getter 和 setter 可以有不同的可访问性。

    【讨论】:

    • 当我问这个问题时,我想我并没有真正考虑属性和字段之间的核心差异。谢谢。
    • 这些不都是语义差异吗?我并不是要轻视这些差异——只是想强调“语义”并不是一件小事。这就是词的含义:如果两个词的含义完全不同,那么它们在语义上是不同的,就像字段和属性一样。
    • 我认为这在很大程度上取决于 LI 解释器如何实现公共字段。如果它们像属性一样被处理(因此就像函数调用一样),那么我想你是对的。
    【解决方案2】:

    “只是语义”在我看来总是矛盾的。是的,它改变了代码的含义。不,我不会用“只是”这个词。

    第一个类有一个公共字段。第二类有一个公共属性,由一个私有字段支持。它们不是一回事:

    • 如果您稍后更改该属性的实现,您将保持二进制兼容性。如果将字段更改为属性,则会失去二进制 源代码兼容性。
    • 数据绑定看不到字段;属性是
    • 在托管代码 (AFAIK) 中不能为字段访问设置断点
    • 公开一个字段会公开你的类型的实现 - 公开一个属性只是谈论你的类型的合同

    请参阅my article about the goodness of properties 了解更多详情。

    【讨论】:

      【解决方案3】:

      在这种情况下,是的,它主要是语义。它对反射等有影响。

      但是,如果您想进行更改,以便在设置 MyProperty 时触发一个事件,例如,您可以轻松地修改后者来执行此操作。前者你不能。您也可以在界面中指定后者。

      由于沿着财产路线走的差异很小,但有几个潜在的优势,我认为您应该始终沿着财产路线走。

      【讨论】:

        【解决方案4】:

        第一个只是一个公共字段,第二个是所谓的自动属性。 C# 编译器将自动属性更改为带有支持字段的常规属性。

        公共字段和属性在 C# 语法中是相等的,但在 IL 中它们是不同的(最近在德国论坛上阅读此内容,无法提供来源,抱歉)。

        马蒂亚斯

        【讨论】:

          【解决方案5】:

          最大的不同是可以给属性添加访问修饰符,比如像这样

          public class MyClass
          {
              public bool MyProperty { get; protected set; }
          }
          

          对于 CLR 字段和属性的访问也不同。因此,如果您有一个字段并且您想稍后将其更改为属性(例如,当您想向 setter 添加代码时)接口将发生变化,您将需要重新编译访问该字段的所有代码。使用 Autoproperty 就没有这个问题。

          【讨论】:

            【解决方案6】:

            我假设您编写的代码不会在您更改代码时被无法重新编译其代码的 3rd 方开发人员调用。(例如,您不为 Microsoft 编写工作.Net 框架是它自己的,或者是 DevExpress 编写的控制工具包)。请记住,Microsoft 的 .NET 框架编码标准适用于编写框架的人员,并试图避免很多问题,如果您不编写供第三方开发人员使用的框架,这些问题甚至都不是问题。

            第二种情况定义了一个适当的,唯一真正的好处是数据绑定不适用于字段。然而,使用专有技术有一个很大的政治优势,您从其他查看您的代码的开发人员那里收到的无效投诉要少得多。

            目前,您不感兴趣的所有其他优点(在您的问题的其他答案中得到了很好的解释),因为任何使用您的代码的程序员都可以稍后将字段更改为适当的,如果需要的话重新编译您的解决方案。

            但是,您不太可能因使用专有技术而被堆积,因此您最好始终使用公共专有技术而不是领域。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-12-30
              • 2011-11-14
              • 2010-10-13
              • 1970-01-01
              • 2010-09-20
              • 2012-01-01
              • 1970-01-01
              相关资源
              最近更新 更多