C#3.0 Autoproperties - 有什么区别?

时间:2009-03-17 10:29:30

标签: syntax c#-3.0

0以下是什么区别?

public class MyClass
{
    public bool MyProperty;
}

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

它只是语义吗?

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

“只是语义学”对我而言似乎总是矛盾。是的,它改变了代码的含义。不,那不是我用“只是”这个词。

第一堂课有一个公共场地。第二类有一个公共财产,由私人领域支持。他们不是一回事:

  • 如果稍后更改属性的实现,则保持二进制兼容性。如果将字段更改为属性,则会丢失二进制源兼容性。
  • 数据绑定看不到字段;属性
  • 无法在托管代码(AFAIK)中对字段访问进行中断访问
  • 公开字段会公开您的类型的实现 - 公开属性只会讨论您的类型的合同

有关详细信息,请参阅my article about the goodness of properties

答案 2 :(得分:2)

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

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

由于沿着物业路线的差异很小但有几个潜在的优势,我认为你应该总是走下物业路线。

答案 3 :(得分:0)

第一个是公共领域,第二个是所谓的自动财产。 C#编译器将自动属性更改为带有后备字段的常规属性。

公共字段和属性在C#语法中是相同的,但在IL中它们是不同的(最近在德国论坛上阅读,不能给你来源,对不起)。

的Matthias

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

我假设您没有编写将由第三方开发人员调用的代码,这些代码在您更改代码时无法重新编译代码。(例如,您不适用于Microsoft写作.Net框架是自己的,或DevExpress编写控件工具包)。请记住,Microsoft的.NET框架编码标准适用于编写框架的人,并且如果您不编写使用第三方开发人员的框架,则会尝试避免许多甚至不是问题的问题。

第二种情况是定义了一个适当的,唯一真正的优点是数据绑定不适用于字段。然而,使用礼节有一个很大的政治优势,你可以从其他开发人员那里看到你的代码得到的无效投诉。

礼仪的所有其他优点(在你的问题的其他答案中都有很好的解释)目前对你不感兴趣,因为任何程序员使用你的代码都可以在以后需要的时候将领域改为适当的重新编译你的解决方案。

然而,你不可能因为使用礼仪而陷入困境,所以你总是使用公共礼仪而不是字段。