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

时间:2009-08-13 14:59:09

标签: c# properties

每当对属性的可信度存在疑问时,我发现大多数讨论都是围绕函数/方法与属性进行的。但是我也想知道令人信服的理由直接使用与关联私有字段和公共字段相关的属性,包含最常见的get / set行为而没有其他处理,我的意思是这样

public string CustomerName;

VS

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

6 个答案:

答案 0 :(得分:22)

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

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

public string CustomerName { get; set; }

有关详细信息,请参阅my article on "Why Properties Matter"

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

这意味着您可以在Groovy中使用“public”字段,编译器将静默生成并调用setter / setter。如果你需要在更改字段时做额外的魔术,你可以引入一个专门的setter,一切都会有效。

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

即使没有任何额外的处理,仍然有一些好处 1.良好的编码习惯。通常,最好不要将字段直接暴露给外部类,而应仅允许它们通过此额外的抽象层进行访问。即使没有额外的处理,最好保持 一致 ,因为您可能需要在代码中的其他地方使用它。 2.当您有多个其他项目依赖于您的项目时,稍后可能需要将字段更改为属性。那将需要重新编译所有内容。 3.您可以将它们与事件一起使用,例如对PropertyChanging或PropertyChanged事件的绑定处理程序。如果是字段,则不可能。