所以我听说在这样的属性中验证一个值:
//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等。
我的小榜样出了什么问题?
答案 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问题的一个很好的概述:
答案 2 :(得分:0)
在SO上也有一些类似的问题。
你的性能应尽可能轻量级。如果setter抛出错误就可以了,但是你可以考虑再将它移动到一个函数中。事情很容易变得混乱。
避免从属性getter中抛出异常。物业吸气剂 应该是简单的操作,不应该有前提条件。如果一个 getter可以抛出异常,应该重新设计它 一种方法。
答案 3 :(得分:-2)
请参阅:Best practices: throwing exceptions from properties,了解为什么从属性中抛出异常是不好的解释和讨论。
不可否认,该帖子谈到了财产瘾君子。
消费者通常认为Setter只是设置一个隐藏属性的私有字段,并且可能根据需要做一些额外的事情,异常是意外行为,你能想象必须将每个set语句包含在try块中吗?
虽然指南可能会接受行为,但猜测开发人员是一场噩梦,验证逻辑应该包含在一个单独的方法中,然后在必要时从属性调用。
如果在设置属性时需要验证或特殊行为,则应使用set方法,例如SetMyProp(string value)
因为它带来了它可能导致异常等的区别。
如果您正在使用类似WPF模型的属性,那么您应该使用WPF的内置数据验证。