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


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

private int _backingField;

public int Property { get { return _backingField; } }

上面和下面有什么区别?

public int Property { get; private set; }

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

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


11053
2018-03-10 11:09


起源



答案:


这两个片段之间没有太大区别 - 例如,你不能通过引用传递属性,但这很少是一个问题。但是,如果您希望该字段是只读的,请执行以下操作:

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

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

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

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

你什么意思?你绝对可以在结构中使用属性。你在谈论支持领域吗?  可变结构,即:

foo.someField.X = 10;

foo.SomeProperty.X = 10;

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


14
2018-03-10 11:12



以XNA的Vector2为例,如果我说公共Vector2 TheVector {get;组;我无法调用TheVector.X = 10;相反,我必须使用实际字段。关于通过值/引用传递的东西。 (你是否有一些阅读材料澄清了c#的值/参考值,作为旁注?) - Taelia
另外,如果我的两个例子之间确实没有区别,为什么这么多人仍然明确地创建了一个支持领域(没有实际目的)? - Taelia
@Taelia:是的,这是一个可变结构的情况 - 我通常会避免这种情况。这是因为该属性返回值的副本。而且我不会试图说明其他人做的事情。 - Jon Skeet
@Taelia自动属性是在C#3.0中引入的。这可以解释为什么一些开发人员使用自动属性而有些人没有。一些使用早期版本的开发人员可能更喜欢“旧方式”。 - Terkel
好的,谢谢你们俩。我看到它经常发生,这让我想知道我是不是通过不创建显式字段来做正确的事情。如果它没有任何区别,那么我将继续编写没有它们的代码。 - Taelia


答案:


这两个片段之间没有太大区别 - 例如,你不能通过引用传递属性,但这很少是一个问题。但是,如果您希望该字段是只读的,请执行以下操作:

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

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

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

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

你什么意思?你绝对可以在结构中使用属性。你在谈论支持领域吗?  可变结构,即:

foo.someField.X = 10;

foo.SomeProperty.X = 10;

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


14
2018-03-10 11:12



以XNA的Vector2为例,如果我说公共Vector2 TheVector {get;组;我无法调用TheVector.X = 10;相反,我必须使用实际字段。关于通过值/引用传递的东西。 (你是否有一些阅读材料澄清了c#的值/参考值,作为旁注?) - Taelia
另外,如果我的两个例子之间确实没有区别,为什么这么多人仍然明确地创建了一个支持领域(没有实际目的)? - Taelia
@Taelia:是的,这是一个可变结构的情况 - 我通常会避免这种情况。这是因为该属性返回值的副本。而且我不会试图说明其他人做的事情。 - Jon Skeet
@Taelia自动属性是在C#3.0中引入的。这可以解释为什么一些开发人员使用自动属性而有些人没有。一些使用早期版本的开发人员可能更喜欢“旧方式”。 - Terkel
好的,谢谢你们俩。我看到它经常发生,这让我想知道我是不是通过不创建显式字段来做正确的事情。如果它没有任何区别,那么我将继续编写没有它们的代码。 - Taelia