你经常看到滥用C#速记吸气剂/安装者?

在C#中,您可以以比其他语言更简单的方式创建getter / setter:

public int FooBar { get; set; } 

这将创建一个内部私有变量,您无法直接寻址,外部属性“FooBar”可以直接访问它。

我的问题是 – 你多久经常看到这种滥用? 它似乎很有可能经常违反封装最佳实践。 不要误解我的意思,我会酌情使用它,并为只读的只写类型的属性使用它的部分变体,但是你的代码库中的其他作者对它的不愉快经历是什么?

澄清:当私人变量合适时,滥用的预期定义确实会产生这样的属性。

我看到它被滥用(在我看来)。 特别是,当开发人员通常会写:

 private readonly int foo; public int Foo { get { return foo; } } 

他们有时会写:

 public int Foo { get; private set; } 

是的,它更短。 是的,从类外面它具有相同的外观 – 但我不认为这些是相同的事情,因为后一种forms允许在同一个类的其他地方设置属性。 它还意味着如果未在构造函数中设置该属性,则不会发出警告,并且该字段对于CLR而言不是只读的。 这些是微妙的差异,但只是为了第二种forms,因为它更简单,忽略差异感觉就像虐待我,即使它是次要的。

幸运的是,现在从C#6开始提供:

 // Foo can only be set in the constructor, which corresponds to a direct field set public int Foo { get; } 

只是不手动编写字段就没有“滥用”; 无论如何,鼓励所有通过财产(不是直接到现场)的访问是好的!

我所知道的最大的问题是使用二进制序列化 ,在不使其版本不兼容的情况下更改回常规字段会有点棘手 – 但随后……使用不同的序列化程序;-p

如果有一个“正确的”只读变体,如果你不需要使用:this() ctor-chaining on structs,那就太好了,但是……嗯!

我没有看到任何滥用它。 说实话,我真的不明白你的意思,因为我看不出这种语法是如何被滥用的。

我不认为自动属性在封装方面比常规属性更差。

如果你的意思是一些开发人员使用公共自动属性而不是私有字段,那么这当然是错误的并打破了封装。