验证属性中的值

ram*_*ral 10 c# encapsulation dry

所以我听说在这样的属性中验证一个值:

//dummy example, let's assume that I want my value without dots
public string MyProp
{
    set
    {
        if(value.Contains('.'))
            throw new ArgumentException("Must not contain '.'", "value");
    }
}
Run Code Online (Sandbox Code Playgroud)

是错的,我应该避免它.

但在早些时候,我被告知这是好方法.我们可以使用封装,只有一个地方可以检查,DRY等.

我的小榜样出了什么问题?

Jul*_*ano 12

在属性设置器中抛出异常没有错.但是你应该抛出一个ArgumentException,并且实际上也设置了属性的值!

private string _myprop;
public string MyProp{
    set{
       if(value.Contains('.')) throw new ArgumentException("Must not contain .");
       this._myprop=value;
    }
    get { return this._myprop; }
}
Run Code Online (Sandbox Code Playgroud)

来自MSDN中最佳实践文章:

属性getter应该是简单的操作,没有任何先决条件.如果getter可能抛出异常,请考虑将该属性重新设计为方法.此建议不适用于索引器.由于参数无效,索引器可能会抛出异常.

从属性设置器中抛出异常是有效且可接受的.