在构造函数中抛出异常或在创建对象时事先验证参数

本文关键字:验证 参数 创建对象 构造函数 抛出异常 | 更新日期: 2023-09-27 18:18:01

我希望经常出现对象实例化的错误参数。

我应该A)首先检查参数,然后创建对象,如果有效。B)创建被try/catch块包围的对象&让构造函数在无效时抛出异常。

有理由选择A或B而不是其他吗?

在构造函数中抛出异常或在创建对象时事先验证参数

如果只有几个(一两个)参数,请使用工厂模式或静态方法进行创建,请尽量避免构造函数中的异常。

或者,如果有很多(或可选的)参数,使用构建器模式。

此外,您可以公开验证方法,因此谨慎的客户端可能会先检查。

另一个选择是使用无参数构造函数和初始化方法,例如返回truefalse

:

  1. 您可以多次重复使用相同的对象(手动或使用对象池)
  2. 验证逻辑将被封装

那么你的类可以是这样的:

class Foo
{
    private Bar m_bar;
    public Foo()
    {
        // do nothing here
    }
    public bool Initialize(Bar bar)
    {
        if (bar == null) // validation logic here
            return false;
        m_bar = bar;
        return true;
    }
}
class Check
{
    private Some getsome;
    public Some GetSome
    {
       get
       {
            return getsome;
       }
       set
       {
           if(value != null)   //or any other logic you want
              getsome = value; //if another logic like value < 10
           else                //you can throw - throw new ArgumentException - for example
              throw new ArgumentNullException("value");
       }
    }
    public Check()
    {
    }
}

如果你想把它传递给构造函数

public Check(Some s)
{
   GetSome = s;
}

记住这里在构造函数中GetSome是公共属性所以你不会错过检查