我总是看到属性使用私有变量来保存这样的值。
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; } }
答案 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。