代码之家  ›  专栏  ›  技术社区  ›  Rob Stevenson-Leggett

C 3.0自动属性-有什么区别?

  •  0
  • Rob Stevenson-Leggett  · 技术社区  · 15 年前

    0以下内容有什么区别?

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

    它只是语义吗?

    6 回复  |  直到 15 年前
        1
  •  5
  •   Dustin Campbell    15 年前

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

    1. 可以重写属性以在后代中提供不同的实现。
    2. 属性可以帮助缓解版本控制问题。例如,将字段更改为库中的属性需要根据库重新编译任何内容。
    3. 属性对于getter和setter可以具有不同的可访问性。
        2
  •  3
  •   Jon Skeet    15 年前

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

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

    • 如果稍后更改属性的实现,则保持二进制兼容性。如果将字段更改为属性,则会同时丢失这两个二进制文件 源兼容性。
    • 数据绑定看不到字段;属性为
    • 无法在托管代码(afaik)中中断字段访问
    • 暴露字段暴露 实施 属于你的类型-暴露一个财产只是谈论 合同 属于你的类型。

    my article about the goodness of properties 了解更多细节。

        3
  •  2
  •   Garry Shutler    15 年前

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

    但是,如果您希望进行更改,以便在设置MyProperty时触发事件,例如,您可以轻松地修改后者以执行该操作。前者不能,也可以在接口中指定后者。

    由于沿着物业路线走下去几乎没有什么区别,但有几个潜在的优势,我认为你应该一直沿着物业路线走。

        4
  •  0
  •   Matthias Meid    15 年前

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

    公共字段和属性在C语法中是相等的,但是在IL中它们是不同的(最近在德国论坛上读到这个,不能给你来源,抱歉)。

    马蒂亚斯

        5
  •  0
  •   Mendelt    15 年前

    最大的区别是,您可以向属性添加访问修饰符,例如这样

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

    对clr字段的访问和属性也是不同的。因此,如果您有一个字段,并且希望稍后将其更改为属性(例如,当您希望向setter添加代码时),则接口将发生更改,您需要重新编译访问该字段的所有代码。有了自动产权,你就没有这个问题了。

        6
  •  0
  •   Ian Ringrose    15 年前

    我假设您编写的代码不是第三方开发人员调用的代码,第三方开发人员可以在您更改代码时重新编译代码。 (例如,您不为编写自己的.NET框架的Microsoft工作,也不为编写控制工具kip的DevExpress工作)。请记住,Microsoft的.NET Framework编码标准是为编写框架的人员制定的,如果您不为第三方开发人员编写框架,则会试图避免许多甚至不是问题的问题。

    第二种情况是定义了一个适当性,这样做的唯一真正好处是数据绑定不能与字段一起工作。然而,在使用礼节方面有一个很大的政治优势,从其他查看代码的开发人员那里得到的无效抱怨要少得多。

    礼仪的所有其他优势(在其他问题的答案中有很好的解释)目前对您不感兴趣,因为任何使用代码的程序员都可以在以后根据需要将字段更改为礼仪,然后重新编译解决方案。

    然而,你不太可能因为使用礼仪而被堆积起来,所以你也总是使用公共礼仪,而不是字段。