【问题标题】:Properties backing field - What is it good for?属性支持字段 - 它有什么用?
【发布时间】:2017-09-08 10:19:28
【问题描述】:

一方面,我知道 Properties 的建议用法是有一个支持字段,如下例所示:

    private int m_Capacity;

    public int Capacity
    {
        get { return m_Capacity > 0 ? m_Capacity : -666; }
        set { m_Capacity = value; }
    }

另一方面,与丢弃字段并仅将属性用于所有目的相比,使用上述示例有什么好处,如下例所示:

    public int Capacity
    {
        get { return Capacity > 0 ? Capacity : -666; }
        set { Capacity = value; }
    }

为常规(非自动实现)属性使用支持字段有什么好处?

【问题讨论】:

  • 您没有发现您的第二个示例导致 StackOverflowExceptions 吗?你写对了吗?您当前是在属性本身内引用该属性。
  • 你说得对。我没有想到这一点,也没有运行代码。
  • @Alex Humphrey: .. 从属性本身内在属性本身内在属性本身内..

标签: c#


【解决方案1】:

如果你这样做:

public int Capacity 
{ 
    get { return Capacity > 0 ? Capacity : -666; } 
    set { Capacity = value; } 
}

那么您的代码将具有无限递归。它永远不会起作用。那是因为容量的吸气剂正在引用自己。二传手也是如此。

除非您使用自动属性,否则您需要一个支持字段

【讨论】:

  • 很遗憾支持字段不能是自动的;那太棒了。
  • 感谢您的简单解释。如果这是真的,是否可以肯定地说在 getter / setter 中没有任何逻辑的属性最好保留为自动实现的属性?也许还有一个“私人二传手”来封装它?
【解决方案2】:

如果您需要访问 m_Capacity 的实际值,而不是从容量属性中获得的“托管”值,则显式私有成员 ID 很有用,

编辑:其他帖子正确指出了语法错误。我也应该提的,但我忽略了它,只是试图回答他的问题,这似乎是关于自动属性的

【讨论】:

  • 或者如果您需要更改容量的计算方式。带有支持私有变量的属性是一种非常简单的解耦方式。
  • 这应该被选为答案。当前接受的答案只是说明您需要一个属性,但不是为什么需要它,这将回答 OP 的问题。
【解决方案3】:

支持字段支持封装的概念。

封装允许您稍后更改类的实现细节而不更改其接口。

这意味着拥有一个包含 getter 和 setter 的支持字段而不是拥有一个公共类成员将使您的代码更加健壮和/或对未来的开发人员或您未来的自己更具可读性。

【讨论】:

    【解决方案4】:

    不要忘记,Properties 只是用于生成 getter 和 setter 方法的简写语法。它们看起来像字段,但实际上不是。

    【讨论】:

    • 也称为“语法糖”。
    【解决方案5】:

    主要是因为你会得到一个 StackOverflow。

    【讨论】:

    • 确实如此。具体来说,这会导致我记得最近在 .Net 代码中看到的大多数 SO。我想知道编译警告是否合适;这种用法有意义吗?
    • Resharper 是否在递归调用时在左边距放置一个小符号?我总是看到它,但我不确定这样的东西是 R# 还是 VS。
    • 可能是 Resharper;我从未在股票 VS 中看到过类似的东西。
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 2014-02-10
    • 2022-01-11
    相关资源
    最近更新 更多