11

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

private int _backingField;

public int Property { get { return _backingField; } }

上面和下面有什么区别?

public int Property { get; private set; }

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

我能找到的唯一区别是在定义它的类中调用值的方式不同。然后是简单的偏好,还是通过属性调用值或直接访问场地?简单的约定?

4

1 回答 1

14

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

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

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

顺便说一句,这相当令人困惑:

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

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

foo.someField.X = 10;

foo.SomeProperty.X = 10;

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

于 2012-03-10T11:12:31.237 回答