2010-07-17 122 views
9

一方面,我知道属性的建议用法是有支持字段,如下面的例子:属性后台 - 它有什么好处?

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; } 
    } 

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

+6

难道你不觉得你的第二个例子会导致StackOverflowExceptions吗?你写得对吗?您目前正在从属性本身引用该属性。 – 2010-07-17 19:13:14

+1

你是对的。我没有想到这一点,也没有运行代码。 – galbarm 2010-07-17 19:20:50

+2

@亚历山大汉弗莱:..从属性本身内的属性本身属性本身.. .. – maxwellb 2010-09-24 20:11:30

回答

21

如果你这样做:

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

那么你的代码将有无限递归。它永远不会工作。这是因为Capacity的getter正在引用自身。二传手同样如此。

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

+1

这是一个耻辱的后盾领域不能自动;那将是真棒。 – 2016-05-29 12:03:22

2

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

+0

确实。这尤其会导致我记得最近在.Net代码中看到的大多数SO。我想知道编译警告是否合适。这个用法是否有意义? – 2010-07-17 19:14:55

+0

当呼叫递归时,Resharper是否在左边空白处放置了一个小符号?我总是看到它,但我不确定这样的事情是R#还是VS. – 2010-07-17 19:21:11

+0

可能是Resharper;我从来没有在股票VS中见过类似的东西。 – cHao 2010-07-17 19:29:42

3

如果你需要访问m_Capacity的实际值,而不是“管理”值你从能力得到显式私人MEMBERID是有用财产,

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

+0

或者如果您需要更改容量计算方式。具有后备私有变量的属性是一种非常简单的解耦方法。 – 2010-07-17 19:15:07

+0

这应该是投票答案。目前接受的答案只是说你需要一个财产,但不是*为什么*它是需要的,这将回答OP的问题。 – 2017-11-29 22:33:04

2

不要忘记,属性是生成getter和setter方法的简写语法。他们看起来像田野,但他们不是。

+0

也被称为“语法糖”。 – 2016-06-27 15:10:05

1

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

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

这意味着使用getter和setter而不是公共类成员的后台字段会使您的代码对于将来的开发人员或未来的自己更健壮和/或可读。