【发布时间】:2009-03-17 10:29:29
【问题描述】:
0 下面有什么区别?
public class MyClass
{
public bool MyProperty;
}
public class MyClass
{
public bool MyProperty { get; set; }
}
仅仅是语义吗?
【问题讨论】:
0 下面有什么区别?
public class MyClass
{
public bool MyProperty;
}
public class MyClass
{
public bool MyProperty { get; set; }
}
仅仅是语义吗?
【问题讨论】:
字段和属性除了语义之外还有很多不同。
【讨论】:
“只是语义”在我看来总是矛盾的。是的,它改变了代码的含义。不,我不会用“只是”这个词。
第一个类有一个公共字段。第二类有一个公共属性,由一个私有字段支持。它们不是一回事:
请参阅my article about the goodness of properties 了解更多详情。
【讨论】:
在这种情况下,是的,它主要是语义。它对反射等有影响。
但是,如果您想进行更改,以便在设置 MyProperty 时触发一个事件,例如,您可以轻松地修改后者来执行此操作。前者你不能。您也可以在界面中指定后者。
由于沿着财产路线走的差异很小,但有几个潜在的优势,我认为您应该始终沿着财产路线走。
【讨论】:
第一个只是一个公共字段,第二个是所谓的自动属性。 C# 编译器将自动属性更改为带有支持字段的常规属性。
公共字段和属性在 C# 语法中是相等的,但在 IL 中它们是不同的(最近在德国论坛上阅读此内容,无法提供来源,抱歉)。
马蒂亚斯
【讨论】:
最大的不同是可以给属性添加访问修饰符,比如像这样
public class MyClass
{
public bool MyProperty { get; protected set; }
}
对于 CLR 字段和属性的访问也不同。因此,如果您有一个字段并且您想稍后将其更改为属性(例如,当您想向 setter 添加代码时)接口将发生变化,您将需要重新编译访问该字段的所有代码。使用 Autoproperty 就没有这个问题。
【讨论】:
我假设您编写的代码不会在您更改代码时被无法重新编译其代码的 3rd 方开发人员调用。(例如,您不为 Microsoft 编写工作.Net 框架是它自己的,或者是 DevExpress 编写的控制工具包)。请记住,Microsoft 的 .NET 框架编码标准适用于编写框架的人员,并试图避免很多问题,如果您不编写供第三方开发人员使用的框架,这些问题甚至都不是问题。
第二种情况定义了一个适当的,唯一真正的好处是数据绑定不适用于字段。然而,使用专有技术有一个很大的政治优势,您从其他查看您的代码的开发人员那里收到的无效投诉要少得多。
目前,您不感兴趣的所有其他优点(在您的问题的其他答案中得到了很好的解释),因为任何使用您的代码的程序员都可以稍后将字段更改为适当的,如果需要的话重新编译您的解决方案。
但是,您不太可能因使用专有技术而被堆积,因此您最好始终使用公共专有技术而不是领域。
【讨论】: