我想验证一个null属性,如果它是NULL,则想返回一个空字符串。为此,我创建了一个类如下:
public class TestValue
{
public string CcAlias
{
get
{
return string.IsNullOrEmpty(CcAlias) ? string.Empty : CcAlias;
}
set
{
CcAlias = CcAlias ?? string.Empty;
}
}
}
用以下代码测试我的课程:
private void TestMethod()
{
var testValue = new TestValue();
testValue.CcAlias = null;
MessageBox.Show(testValue.CcAlias);
//I thought an empty string will be shown in the message box.
}
不幸的是,错误即将发生,如下所述:
System.StackOverflowException was unhandled
HResult=-2147023895
Message=Exception of type 'System.StackOverflowException' was thrown.
InnerException:
答案 0 :(得分:3)
你的setter和getter以递归方式调用自己:
set
{
CcAlias = CcAlias ?? string.Empty;
}
这会调用CcAlias
getter,然后再调用本身(通过测试string.IsNullOrEmpty(CcAlias)
)并一次又一次地调用StackOverflowException
。
您需要声明一个支持字段并在您的setter中设置:
public class TestValue
{
private string __ccAlias = string.Empty; // backing field
public string CcAlias
{
get
{
// return value of backing field
return string.IsNullOrEmpty(_ccAlias) ? string.Empty : _ccAlias;
}
set
{
// set backing field to value or string.Empty if value is null
_ccAlias = value ?? string.Empty;
}
}
}
因此,您将字符串存储在支持字段_ccAlias
中,并且您的getter返回此字段的值
您的setter现在设置此字段。 setter的参数在关键字value
。