有或没有支持字段的自动属性 ​​- 首选项?

时间:2012-03-10 11:09:22

标签: c# automatic-properties backing-field

我知道在使用自动属性时,编译器会在屏幕后面创建自己的支持字段。但是,在我阅读的许多程序中,我看到人们明确地写了

private int _backingField;

public int Property { get { return _backingField; } }

上面和下面有什么区别?

public int Property { get; private set; }

我理解当你在getter或setter中实际存在副作用时使用该属性是显而易见的,但通常情况并非如此。另外,我知道你必须在结构的情况下明确使用支持字段,你不能通过属性访问它们的成员。

我能找到的唯一区别是调用值的方式在它定义的类中是不同的。那么它是简单的首选项,还是通过其属性或通过直接访问该领域? 简单约定?

1 个答案:

答案 0 :(得分:14)

这两个片段之间没有太大区别 - 例如,您无法通过引用传递属性,但这很少成为问题。但是,如果您希望该字段只读,如下所示:

private readonly int _backingField;    
public int Property { get { return _backingField; } }

然后有区别。我上面编写的代码可以防止在类中的其他地方更改值,从而清楚地表明这实际上是不可变的。我真的希望能够声明一个只读字段,该字段具有只读的自动实现属性,只能在构造函数中设置 - 但目前不可用。

顺便说一下,这很令人困惑:

  

另外,我知道你必须在结构的情况下明确使用支持字段,你不能通过属性访问他们的成员。

你是什​​么意思?你绝对可以在结构中使用属性。你在谈论支持 可变结构的字段,即:

之间的区别
foo.someField.X = 10;

foo.SomeProperty.X = 10;

?如果是这样,我通常会通过使我的结构不可变来避免这是一个问题:)