如何防止c#中对象的实例化

时间:2014-01-23 00:14:09

标签: c#

我需要的是检查传递给构造函数的参数,并防止特定对象被实例化,以防它们被视为无效。

我发现可以抛出异常,因此对象引用将按预期结束“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) { }
}

4 个答案:

答案 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。

Can we interrupt creating an object in constructor