在C#中,你可以用比其他语言更简单的方式创建getter / setter:
public int FooBar { get; set; }
这会创建一个您无法直接处理的内部私有变量,外部属性“FooBar”可以直接访问它。
我的问题是 - 您经常看到这种滥用的情况?它似乎很有可能经常违反封装最佳实践。不要误解我的意思,我会酌情使用它,并为只读的只写类型的属性使用它的部分变体,但是你的代码库中的其他作者对它的不愉快经历是什么?
澄清:当私有变量合适时,滥用的预期定义确实会创建这样的属性。
答案 0 :(得分:31)
我看到它被滥用(在我看来)。特别是,当开发人员通常写:
时private readonly int foo;
public int Foo
{
get
{
return foo;
}
}
他们有时会写:
public int Foo { get; private set; }
是的,它更短。是的,从类外面它具有相同的外观 - 但我不认为这些是相同的事情,因为后一种形式允许在同一个类的其他地方设置属性。它还意味着如果未在构造函数中设置该属性,则不会发出警告,并且该字段对于CLR而言不是只读的。这些是微妙的差异,但只是为了第二种形式,因为它更简单,忽略差异感觉就像虐待我,即使它是次要的。
幸运的是,从C#6开始提供此功能:
// Foo can only be set in the constructor, which corresponds to a direct field set
public int Foo { get; }
答案 1 :(得分:3)
没有“滥用”,只是不手动写字段;无论如何,鼓励所有通过财产(不是直接到现场)的访问是好的!
我所知道的最大问题是binary serialization,在没有使版本不兼容的情况下更改回常规字段会有点棘手 - 但是......使用不同的序列化程序;-p < / p>
如果有一个“正确的”只读变体会很好,如果你不需要在结构上使用:this()
ctor-chaining,那么...... meh!
答案 2 :(得分:1)
我没有看到任何滥用它。说实话,我真的不明白你的意思,因为我看不出这种语法是如何被滥用的。
答案 3 :(得分:0)
我认为自动属性在封装方面不比常规属性差。
如果你的意思是某些开发人员使用公共自动属性而不是私有字段,那么这当然是错误的并打破封装..