【问题标题】:Auto-properties with or without backing field - preference?带或不带支持字段的自动属性 ​​- 偏好?
【发布时间】:2012-03-27 14:31:32
【问题描述】:

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

private int _backingField;

public int Property { get { return _backingField; } }

上面和下面有什么区别?

public int Property { get; private set; }

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

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

【问题讨论】:

    标签: c# automatic-properties backing-field


    【解决方案1】:

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

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

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

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

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

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

    foo.someField.X = 10;
    

    foo.SomeProperty.X = 10;
    

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

    【讨论】:

    • 以XNA的Vector2为例,如果我说public Vector2 TheVector { get;放;我不能调用 TheVector.X = 10;相反,我必须使用实际字段。关于按值/引用传递的东西。 (作为旁注,您是否有一些阅读材料澄清了 c# 的值/引用传递?)
    • 另外,如果我的两个示例之间真的没有区别,为什么这么多人仍然明确地创建一个支持字段(没有真正的目的)?
    • @Taelia:是的,这就是可变结构的情况——我通常会避免这种情况。这是因为该属性返回该值的副本。而且我不会试图解释其他人所做的事情的原因。
    • @Taelia 自动属性是在 C# 3.0 中引入的。这可以解释为什么有些开发人员使用自动属性而有些不使用。因为一些使用早期版本的开发者可能更喜欢“旧方式”。
    • 好的,谢谢两位。我经常看到这种情况发生,这让我想知道我是否通过不创建显式字段来做正确的事情。如果没有区别,那么我会在没有它们的情况下继续编写代码。
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多