仅在.NET中没有相应字段的情况下使用属性的缺点?

时间:2009-07-03 20:37:01

标签: c# .net vb.net

我的类只有public customerName {get;组;}。它们是公开的,因为它们是在课外访问的。他们也可以在课堂上访问。它们提供良好的封装和更好的调试。如果我需要知道谁在访问它以及何时访问,我可以在其中设置一个断点。

我的问题是,只使用没有相应字段的属性有什么缺点?我可以将setter或getter设为私有,内部..等等,这意味着我还可以灵活地在需要时进行范围设定。

8 个答案:

答案 0 :(得分:11)

使用BinaryFormatter进行序列化 - 如果您需要稍后将属性更改为“常规”属性,则会出现问题,例如添加一些验证/事件/ etc-sinc { {1}}使用字段名称。并且您不能复制它,因为编译器生成的字段名称不能写为合法的C#。

这是查看基于合同的序列化程序的一个很好的理由。有关详细信息,请参阅this blog entry

答案 1 :(得分:5)

您无法创建真正只读属性,因为您必须同时定义setter和getter。您只能使用私有setter从外部实现伪读取属性。

否则,如上所述,没有其他缺点。

答案 2 :(得分:3)

简单属性没有缺点。编译器为您创建支持字段。这个blog entry解释了编译器如何处理自动实现的属性。

答案 3 :(得分:3)

并非真正的劣势,但您必须了解自动属性的默认值。使用“经典”属性,我们始终用于初始化支持字段,例如像这样:

private bool _flag = true;
public bool Flag
{
  get { return _flag; }
  set { _flag = value; }
}

这使得该属性的默认值显而易见。

使用自动属性,您必须知道不同类型的默认值(例如bool为false)。如果您不希望该属性具有默认值,则必须在构造函数中初始化它:

class MyClass
{
  public bool Flag { get; set; }
  public MyClass()
  {
    Flag = true;
  }
}

这意味着,如果要将属性初始化为非默认值,或者属性属于引用类型(类),则必须实现构造函数

但正如我写的那样,我并不认为这是一个劣势,只是你必须知道的事情。

答案 4 :(得分:2)

问题是,对应的字段。您只是看不到它,因为编译器会为您创建它。自动属性只是语法糖或创建字段的简写方式。

答案 5 :(得分:1)

没什么大不了的。只是边缘情况,比如你需要将属性传递给参数通过引用(refout)传递的方法,这是属性不可能的(因为在内部,它们只是get_Property / set_Property方法由编译器实现,而不是某种特殊字段),你需要一个明确的私有支持字段。

编辑:哦,并借调'不readonly'属性,这实际上相当常见。

答案 6 :(得分:0)

如果您不需要在get和/或set访问器中执行任何特定逻辑,那就没有缺点......

答案 7 :(得分:0)

从代码可读性的角度来看,我说它们很糟糕。语法糖很适合编写代码,但对于阅读代码却很糟糕。作为开发人员,我们留下的代码最终将由一些可怜的开发人员继承,这些开发人员必须理解我们所做的以及代码中发生的事情。我真的反对更改语言,以便在存在相同构造的已建立语法时简单地保存击键。