您经常看到滥用C#速记吸气剂/孵化器?

Ben*_*key 7 c# getter setter encapsulation automatic-properties

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

public int FooBar { get; set; }
Run Code Online (Sandbox Code Playgroud)

这将创建一个内部私有变量,您无法直接使用外部属性"FooBar"直接访问它.

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

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

Jon*_*eet 32

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

private readonly int foo;
public int Foo
{ 
    get 
    { 
        return foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

他们有时会写:

public int Foo { get; private set; }
Run Code Online (Sandbox Code Playgroud)

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

幸运的是,现在可以从C#6开始使用它:

// Foo can only be set in the constructor, which corresponds to a direct field set
public int Foo { get; }
Run Code Online (Sandbox Code Playgroud)

  • @Steven:哦,我完全同意.这是我的#1"这非常简单,请为C#5做到这一点".团队知道,我很有希望 - 以正常模式为模"即使是一个小功能也需要大量的设计,实施和测试工作" . (2认同)
  • 作为@ JonSkeet愿望的更新:从C#6.0开始,现在可以使用只读自动实现的属性.只需排除标准语法的`set;`部分.您还可以通过附加`= someValueExpression`在同一行上初始化它们. (2认同)
  • @dreikin引用的C#6.0语法示例,改编自[link] http://stackoverflow.com/a/34743656/1991614`public class Dog {public string Name {get; 公共DateTime PuppyBorn {get; } = DateTime.Now; public Dog(字符串名称){Name = name; } (2认同)