财产(没有额外处理)与公共领域

每当有关于Properties的可信度的问题时,我发现大多数讨论都是围绕函数/方法和属性进行的。 但我还想知道使用属性与相关私有字段直接与公共字段直接使用的令人信服的理由,包含最常见的获取/设置行为而没有其他处理,我的意思是这种方式

public string CustomerName; 

VS

 private string customerName; public string CustomerName { get{return customerName;} set(string value){this.customerName=value;} } 

如果您以后需要添加其他行为,则可以获得源/二进制兼容性,您可以添加断点,并且它只是在哲学上更清晰(关注行为,而不是存储机制)。

请注意,您不需要C#3中的整个后一个块:

 public string CustomerName { get; set; } 

有关详细信息,请参阅我的文章“为什么属性重要” 。

  1. 您可以覆盖或至少在派生类中创建“新”属性

  2. 此时人们希望公开属性并隐藏字段。 如果有人会反思你的课程(它会像Castle Windsor,NHibernate这样的工具变得越来越普遍),那么就会有一个不同的世界,他们可能不会检查暴露的领域。

这主要是Java中的一个错误。 在许多其他语言(Python,Delphi,Groovy)中,编译器将为您生成getter和setter, 除非您提供代码。

这意味着您可以在Groovy中使用“public”字段,编译器将以静默方式生成并调用setter / setter。 如果您需要在更改字段时执行额外的魔术,则可以引入专门的setter,一切都会正常工作。

这是现实与设计发生冲突的事情之一。 Java设计者不希望编译器做任何你看不到的事情。 许多年前似乎是一个好主意,结果并不太好。

我注意到一个有用的财产。 如果要将对象的集合绑定到DataGrid或DataGridView或其他可绑定控件,则唯一可识别的可评估名称是Property而不是public字段。

您还可以使用属性提供一些基本validation。 例如,为了防止将属性设置为无效状态,如高度的负值:

 private int height; public int Height { get{ return height; } set { if (value > 0) { height = value; } } }