以下模式在我的代码中很常见:一个类有多个构造函数。一个是“指定构造函数”,其他是为了方便。代码可能如下所示:
class Foo
{
Foo(int bar, string baz)
{
this.Bar = bar;
this.Baz = baz;
}
Foo()
: this(0, "Empty baz")
{
}
Foo(Foo f)
: this(f.Bar, f.Baz)
{
}
int Bar {get;set;}
string Baz {get;set;}
}
在无参数构造函数调用的情况下this(...)
,这工作正常。但是,如果有人将null
作为参数传递给复制构造函数Foo(Foo)
,则结果将是由于表达式而导致的空引用异常f.Bar
。因为我希望看到 ArgumentNullException,所以在这种情况下我通常会偏离模式并“手动”实现构造函数,这会导致重复代码。有没有一种优雅的方法来避免这种情况,即拥有一个指定的构造函数并仍然为其他构造函数执行参数验证?
编辑:这个例子只是为了描述这个问题。在现实世界的例子中,会有更复杂的参数验证逻辑和初始化代码。