我需要检查传递给构造函数的参数,并防止在将特定对象视为无效的情况下实例化特定对象。
我发现,可以引发异常,因此对象引用将按预期以“ null”结尾。
例如,仅当传递给构造函数的整数为非负数时,才会实例化此类。
class MyClass
{
public MyClass(int a)
{
if (a < 0)
{
throw new Exception();
}
}
}
尽管上面的方法很好用,但我敢打赌,每次要构造一个新对象时,c#都可以提供一种更干净的方法来执行此操作,从而避免了try / catch需求的额外成本。
static void Main(string[] args)
{
MyClass e1;
MyClass e2;
try
{
e1 = new MyClass(1);
}
catch(Exception) { }
try
{
e2 = new MyClass(-1);
}
catch(Exception) { }
}
在这种情况下,您应该考虑使用Factory Pattern。您构造了构造函数private
,而是使用静态方法返回实例。
public class Foo {
private Foo(int a) { ... }
public static Foo GetFoo(int a) {
if (a < 0) {
throw new Exception("No Foo for you!");
// or
return null;
}
return new Foo(a);
}
}
public class Program {
public static void Main() {
Foo f;
f = new Foo(); // Not allowed, ctor is private.
f = Foo.GetFoo(42); // Do this instead.
}
}
有了这个,您可以做一些非常有趣的事情。
在这里,我们有一个Foo
带有不同子类的类。通过使用工厂模式,我们可以构造特定Foo
子类的实例,而外界甚至都不知道存在任何子类!
public abstract class Foo {
// Private implementations of Foo
// No one outside can ever construct one directly.
private class RedFoo : Foo { }
private class GreenFoo : Foo { }
private class BlueFoo : Foo { }
public static Foo GetColoredFoo(string color) {
switch (color.ToLower()) {
case "red": return new RedFoo();
case "green": return new GreenFoo();
case "blue": return new BlueFoo();
}
throw new Exception("No Foo for that color!");
}
}
public class Program {
public static void Main() {
Foo f;
f = new Foo(); // Not allowed; Foo is abstract
f = new RedFoo(); // Not allowed, RedFoo is private, inside of Foo
f = Foo.GetColoredFoo("red"); // Returns an instance of RedFoo
}
}
这将“如何最好地构造您真正需要的对象”的知识移到类本身的定义中,并且当然消除了try / catch。您可以在静态工厂方法中应用所需的任何逻辑。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句