7

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

public int FooBar { get; set; }

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

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

澄清:滥用的预期定义确实是在私有变量合适时创建这样的属性。

4

4 回答 4

34

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

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; }
于 2009-07-02T09:33:07.047 回答
3

根本不手动编写该字段并没有“滥用”;无论如何,最好鼓励所有通过该属性访问(而不是直接访问该字段)!

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

如果有一个“适当的”只读变体,并且您不需要:this()在结构上使用 ctor-chaining,那就太好了,但是....嗯!

于 2009-07-02T09:31:20.450 回答
1

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

于 2009-07-02T09:31:35.597 回答
0

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

如果您的意思是某些开发人员使用公共自动属性而不是私有字段,那么这当然是错误的并且会破坏封装..

于 2009-07-02T09:33:23.363 回答