我对理解属性和变量感到困惑
public class ABC() { public int A; public int B { get; set; } }
A和B之间的确切区别是什么?
正如许多人指出的那样,A是一个 字段 ,B是一个 属性 。
真正的问题是,您为什么要关心以及使用什么?
我指的是Jonathan Aneja的博客文章:
(在VB中,但它也适用于C#;)
那么,为什么要对字段使用属性,有五个原因:
1.字段不能在接口中使用 您不能通过接口强制对象的公共合同中存在字段。对于属性,虽然效果很好。 2.验证 尽管您的应用程序当前可能不需要任何验证逻辑来设置特定值,但是更改业务需求可能需要稍后插入此逻辑。那时,将字段更改为属性对于API使用者来说是一项重大更改。(例如,如果有人通过反射检查您的班级)。 3.二进制序列化 如果使用二进制序列化,则将字段更改为属性是一项重大更改。顺便说一句,这是VB10的自动实现属性具有“可绑定”后备字段(即,您可以在代码中表示后备字段的名称)的原因之一- 这样,如果您将自动实现的属性更改为扩展的属性,您仍然可以通过保持背景字段名称相同来保持序列化兼容性(在C#中,您不得不更改它,因为它会生成具有不可绑定名称的背景字段)。 4.许多.NET数据绑定基础结构绑定到属性,但不绑定到字段 我已经听过双方关于这是否是一件好事的争论,但现实是这就是现在的工作方式。 (我的注意:WPF绑定适用于属性) 5.暴露公共场所[违反FxCop](http://msdn.microsoft.com/en- us/library/ms182141(VS.80).aspx) 由于上述许多原因:)
您不能通过接口强制对象的公共合同中存在字段。对于属性,虽然效果很好。
尽管您的应用程序当前可能不需要任何验证逻辑来设置特定值,但是更改业务需求可能需要稍后插入此逻辑。那时,将字段更改为属性对于API使用者来说是一项重大更改。(例如,如果有人通过反射检查您的班级)。
如果使用二进制序列化,则将字段更改为属性是一项重大更改。顺便说一句,这是VB10的自动实现属性具有“可绑定”后备字段(即,您可以在代码中表示后备字段的名称)的原因之一- 这样,如果您将自动实现的属性更改为扩展的属性,您仍然可以通过保持背景字段名称相同来保持序列化兼容性(在C#中,您不得不更改它,因为它会生成具有不可绑定名称的背景字段)。
我已经听过双方关于这是否是一件好事的争论,但现实是这就是现在的工作方式。 (我的注意:WPF绑定适用于属性)
us/library/ms182141(VS.80).aspx)
由于上述许多原因:)
可能还有更多原因。
我还想指出Jeff Atwood的博客文章,并引用其中的一段话:
这里最重要的事情是避免编写无关紧要的代码。 围绕公共变量的属性包装器是毫无意义的代码的本质。