我需要的是检查传递给构造函数的参数,并防止特定对象被实例化,以防它们被视为无效。
我发现可以抛出异常,因此对象引用将按预期结束“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) { }
}
答案 0 :(得分:10)
在这种情况下,您应该考虑使用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。您可以在静态工厂方法中应用所需的任何逻辑。
答案 1 :(得分:3)
您可以使用MarcinJruaszek建议的工厂模式,将构造函数设为私有并添加静态方法:
public class myClass
{
private myClass(int a)
{
// constructor
}
public static myClass Create(int a){
if (a < 0)
{
return null;
}
return new myClass(a);
}
}
做myClass.Create(1)
。
答案 2 :(得分:1)
我建议你做的是创建一个类的静态方法,它接受你需要验证的参数并让它返回对象。我不知道在构造函数中放弃对象创建而不抛出异常的方法。
答案 3 :(得分:1)
试试这个。您可以通过创建工厂类从构造函数静态方法发送Null。