验证属性中的值

时间:2013-04-08 17:28:26

标签: c# dry encapsulation

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

//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");
    }
}

错了,我应该避免它。

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

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

4 个答案:

答案 0 :(得分: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; }
}

来自article on best practices in MSDN

  

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

     

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

答案 1 :(得分:0)

以上是前面提到的Stack Overflow问题的一个很好的概述:

C# add validation on a setter method

答案 2 :(得分:0)

在SO上也有一些类似的问题。

你的性能应尽可能轻量级。如果setter抛出错误就可以了,但是你可以考虑再将它移动到一个函数中。事情很容易变得混乱。

  

避免从属性getter中抛出异常。物业吸气剂   应该是简单的操作,不应该有前提条件。如果一个   getter可以抛出异常,应该重新设计它   一种方法。

Best practices: throwing exceptions from properties

What exception to throw from a property setter?

答案 3 :(得分:-2)

请参阅:Best practices: throwing exceptions from properties,了解为什么从属性中抛出异常是不好的解释和讨论。

不可否认,该帖子谈到了财产瘾君子。

消费者通常认为Setter只是设置一个隐藏属性的私有字段,并且可能根据需要做一些额外的事情,异常是意外行为,你能想象必须将每个set语句包含在try块中吗?

虽然指南可能会接受行为,但猜测开发人员是一场噩梦,验证逻辑应该包含在一个单独的方法中,然后在必要时从属性调用。

如果在设置属性时需要验证或特殊行为,则应使用set方法,例如SetMyProp(string value)因为它带来了它可能导致异常等的区别。

如果您正在使用类似WPF模型的属性,那么您应该使用WPF的内置数据验证。