Jus*_*ner 9 c# constructor exception
在C#中,我想与调用方法进行通信,传递给对象的参数导致其实例化失败.
// okay
Banana banana1 = new Banana("green");
// fail
Banana banana2 = new Banana("red");
Run Code Online (Sandbox Code Playgroud)
抛出异常?如果是这样的话?
Cod*_*ous 23
throw new ArgumentException("Reason", "param name");
Run Code Online (Sandbox Code Playgroud)
很多(所有?)的答案都说要抛出异常,但我确信我已经看到框架设计团队的官方声明建议不要抛弃构造函数中的异常.
请注意,.NET框架中的行为类似于"Banana"示例(其中只有某些值适合实例化对象)不使用构造函数,而是使用静态工厂方法.例如,System.Net.WebRequest没有公共构造函数,而是使用静态Create方法,如果提供的字符串不是有效URI,则可以引发异常.除了一些例外 - 请参阅下面的更新.
因此,对于您的代码,我会将Banana的构造函数更改为protected,并引入如下方法:
public static Banana Create(string color)
{
if (color != "green" && color != "yellow")
{
throw new ArgumentException("Color must be 'green' or 'yellow'",
"color");
}
return new Banana(color);
}
Run Code Online (Sandbox Code Playgroud)
更新
好吧,从构造函数中抛出异常似乎并不是一个坏主意.事实上,如果您将无效的文件名传递给其构造函数,System.IO.FileStream就是这样做的.我想使用静态工厂方法的想法只是更明确地说明如何创建实例(例如,如果上面的方法被称为"FromColor").