我的类只有public customerName {get;组;}。它们是公开的,因为它们是在课外访问的。他们也可以在课堂上访问。它们提供良好的封装和更好的调试。如果我需要知道谁在访问它以及何时访问,我可以在其中设置一个断点。
我的问题是,只使用没有相应字段的属性有什么缺点?我可以将setter或getter设为私有,内部..等等,这意味着我还可以灵活地在需要时进行范围设定。
答案 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)
没什么大不了的。只是边缘情况,比如你需要将属性传递给参数通过引用(ref
或out
)传递的方法,这是属性不可能的(因为在内部,它们只是get_Property / set_Property方法由编译器实现,而不是某种特殊字段),你需要一个明确的私有支持字段。
readonly
'属性,这实际上相当常见。
答案 6 :(得分:0)
如果您不需要在get和/或set访问器中执行任何特定逻辑,那就没有缺点......
答案 7 :(得分:0)
从代码可读性的角度来看,我说它们很糟糕。语法糖很适合编写代码,但对于阅读代码却很糟糕。作为开发人员,我们留下的代码最终将由一些可怜的开发人员继承,这些开发人员必须理解我们所做的以及代码中发生的事情。我真的反对更改语言,以便在存在相同构造的已建立语法时简单地保存击键。