c#属性集 - 为什么使用私有变量

时间:2011-12-13 16:35:14

标签: c# properties

我总是看到属性使用私有变量来保存这样的值。

private int _myValue;
public int MyValue { get { return _myValue; } set { _myValue = value; } }

为什么我不能跳过私有变量并执行此操作...

public int MyValue { get { return MyValue; } set { MyValue = value; } }

*注意:我不想使用自动属性,因为我希望能够做到这样的事情。

public int MyValue { get { return MyValue.Tolower().Trim(); } set { MyValue = value; } }

6 个答案:

答案 0 :(得分:15)

因为无限循环最终会导致抛出StackOverflowException。

答案 1 :(得分:5)

因为没有变量,您最终会得到endless recursion,导致stack overflow: - )

public int MyValue
{
    get { return MyValue; }
    set { MyValue = value; }
}  

因此,您需要支持字段。保留支持字段private的原因是隐藏实现细节。如果它是公开的,那么声明一个属性来访问它是没有任何意义的。

答案 2 :(得分:2)

  

为什么我不能跳过私有变量并执行此操作...

   public int MyValue { get { return MyValue; } set { MyValue = value; } }

因为return MyValue会递归调用get属性的MyValue访问者,导致无限递归,最终导致StackOverflowException(同样地,MyValue = value会对set访问者

做同样的事情

答案 3 :(得分:0)

getter和setter有一个支持属性,以防你想进行某种验证。如果没有,那么使用自动属性,在实现自动属性之前,这个问题出现了,这就是它们被实现的原因。

答案 4 :(得分:0)

如前所述,这会导致堆栈溢出,原因是当您键入MyValue = value时,您将在无限循环中再次调用该集合,直到程​​序耗尽堆栈空间,同样的情况发生在得到。

public int MyValue { get { return MyValue; } set { MyValue = value; } }

答案 5 :(得分:0)

除了Ians响应之外,它们允许您将属性初始化为您选择的默认值,而不是null:

private string _myString = string.Empty;

public string MyString
{
     get{ return _myString;}
     set{ _myString = value;}
}
如果从未调用过setter,

将返回string.Empty而不是null。