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

时间:2013-06-11 22:56:45

标签: c# exception

我期望对象实例化的错误参数经常发生。

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

有没有理由选择A或B而不是另一个?

3 个答案:

答案 0 :(得分:3)

如果只有少数(一个或两个)参数使用factory pattern或静态方法进行创建,请尝试避免构造函数中的异常。

或者,如果有许多(或可选)参数,请使用builder pattern

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

答案 1 :(得分:1)

您还有另一种选择是使用无参数构造函数和返回truefalse的初始化方法。

这样:

  1. 您可以多次重复使用同一个对象(手动或使用对象池)
  2. 验证逻辑将被封装
  3. 所以你的课程看起来像这样:

    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;
        }
    }
    

答案 2 :(得分:0)

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是公共属性,所以你不要错过检查