在returing之前验证null属性

时间:2016-08-29 09:43:30

标签: c# get set stack-overflow

我想验证一个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: 

1 个答案:

答案 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

中传递