如何防止在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) { }
}
乔纳森·莱因哈特(Jonathon Reinhart)

在这种情况下,您应该考虑使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何防止在C#中实例化对象

来自分类Dev

如何在 Unity C# 中为实例化对象提供唯一 ID

来自分类Dev

在Robot Framework中实例化C#对象

来自分类Dev

如何在C#的方法调用中传递对象实例?

来自分类Dev

C#中的对象实例化之间的区别:将对象存储在引用中与直接调用方法

来自分类Dev

在C#中,如果(字符串)类名称已知,如何从该(字符串)类实例化对象?

来自分类Dev

如何在Java中实例化对象?

来自分类Dev

如何实例化组中的对象?

来自分类Dev

如何在 Unity 中实例化对象?

来自分类Dev

您可以从C#中的Task中的实例化获取对象吗?

来自分类Dev

在方法中实例化并添加到C#中Collection的对象的持久性

来自分类Dev

在C ++ 14中防止L值实例化

来自分类Dev

在C#中实例化IEnumerable数组

来自分类Dev

在C#中实例化Singleton

来自分类Dev

如何获得对在Objective-C中实例化第二个对象的对象的引用?

来自分类Dev

使用C#中的嵌套类反序列化JSON。在哪里创建对象实例?

来自分类Dev

相同类的实例化对象是否添加到内存(C#)中?

来自分类Dev

在C#对象实例化中,如果捕获异常,是否需要Null检查

来自分类Dev

无法在字符串中使用C#中的反射/汇编/激活器实例化对象

来自分类Dev

计算使用LINQ函数实例化的C#对象中的天数

来自分类Dev

C#中new<object>(){}和new<object>{}实例化对象的区别

来自分类Dev

在 C# 中使用基类和派生类实例化数组中的对象

来自分类Dev

如何在C#中序列化对象数组?

来自分类Dev

如何改善C#中的类对象初始化?

来自分类Dev

如何改善C#中的类对象初始化?

来自分类Dev

对象的C#实例

来自分类Dev

为什么我的C#对象没有实例化?

来自分类Dev

用鼠标移动实例化的对象(Visual Studio C#)

来自分类Dev

在c#中如何防止类被修改

Related 相关文章

  1. 1

    如何防止在C#中实例化对象

  2. 2

    如何在 Unity C# 中为实例化对象提供唯一 ID

  3. 3

    在Robot Framework中实例化C#对象

  4. 4

    如何在C#的方法调用中传递对象实例?

  5. 5

    C#中的对象实例化之间的区别:将对象存储在引用中与直接调用方法

  6. 6

    在C#中,如果(字符串)类名称已知,如何从该(字符串)类实例化对象?

  7. 7

    如何在Java中实例化对象?

  8. 8

    如何实例化组中的对象?

  9. 9

    如何在 Unity 中实例化对象?

  10. 10

    您可以从C#中的Task中的实例化获取对象吗?

  11. 11

    在方法中实例化并添加到C#中Collection的对象的持久性

  12. 12

    在C ++ 14中防止L值实例化

  13. 13

    在C#中实例化IEnumerable数组

  14. 14

    在C#中实例化Singleton

  15. 15

    如何获得对在Objective-C中实例化第二个对象的对象的引用?

  16. 16

    使用C#中的嵌套类反序列化JSON。在哪里创建对象实例?

  17. 17

    相同类的实例化对象是否添加到内存(C#)中?

  18. 18

    在C#对象实例化中,如果捕获异常,是否需要Null检查

  19. 19

    无法在字符串中使用C#中的反射/汇编/激活器实例化对象

  20. 20

    计算使用LINQ函数实例化的C#对象中的天数

  21. 21

    C#中new<object>(){}和new<object>{}实例化对象的区别

  22. 22

    在 C# 中使用基类和派生类实例化数组中的对象

  23. 23

    如何在C#中序列化对象数组?

  24. 24

    如何改善C#中的类对象初始化?

  25. 25

    如何改善C#中的类对象初始化?

  26. 26

    对象的C#实例

  27. 27

    为什么我的C#对象没有实例化?

  28. 28

    用鼠标移动实例化的对象(Visual Studio C#)

  29. 29

    在c#中如何防止类被修改

热门标签

归档