17

我需要知道如何防止类在.net 中被实例化?

我知道一些方法,比如制作抽象类和静态类。

还有其他方法可以实现这一目标吗?

4

5 回答 5

22

如果您绝对不想要任何实例,则将类设为静态是最好的方法。这会阻止任何人创建实例。该类将是密封的抽象的,并且不会有任何构造函数。

此外,该语言会注意到它是一个静态类,并阻止您在各种暗示实例的地方使用它,例如类型参数和变量。这比仅仅拥有一个私有构造函数更清楚地表明了意图——这可能意味着在该类中创建了一些实例(例如,对于单例实现)。

哦,将类设为静态也会阻止您在类中引入任何无意义的实例成员:)

有关静态类的更多信息,请参阅MSDN

于 2012-04-13T12:55:07.257 回答
18

标记构造函数privateprotected或者如果从另一个程序集中使用,internal

于 2012-04-13T12:51:46.650 回答
7

标记构造函数private。当然,这并不妨碍类通过static方法实例化自己,例如...

更实际的是,禁止类实例化的目的是什么。如果它有一个单例,那么一个private构造函数是合适的。如果是强制子类化,做类abstract更好;如果要拥有一个具有实用方法的类,则使其成为static一种方法(那么您只能拥有static方法)。

于 2012-04-13T12:51:20.440 回答
3

我需要知道如何防止类在.net 中被实例化?

你的问题不清楚。

你的意思是在运行时实例化?制作类abstractstatic.

您的意思是在代码中无法访问构造函数吗?制作构造函数private。但请注意,有人仍然可以使用反射来获取构造函数的句柄并在运行时实例化实例。

那么,你的意思是什么?

于 2012-04-13T12:54:08.710 回答
2

如果问题是:

static如果没有你的类是or ,你怎么能让你的类不被实例化abstract

那么这个问题的答案是实现单例模式,在 .NET 4+ 中,这很容易通过以下方式完成:

public sealed class myClass
{
    private static readonly Lazy<myClass> lazyInstance = 
        new Lazy<myClass>(() => new myClass());

    public static Instance
    {
        get
        {
            return lazyInstance.Value;
        }
    }

    private myClass()
    {
        // constructor logic here
    }
}

单例模式允许您将类作为对方法的引用传递,同时仍确保您只有一个类的实例。它还使测试变得更加容易,因为您可以拥有一个实现的ImyClass实例myClass,这在制作模拟对象时非常有用。

如果没有 .NET4,您仍然可以实现单例模式,例如:

private static readonly myClass instance = new myClass();

public static Instance
{
    get
    {
        return instance;
    }
}

// rest of code remains the same

在调用之前没有延迟加载,还有很多其他方法(我认为有 6 种不同的方法),但以上两种是最常见的。

总之,这个问题很可能是问你是否知道单例模式,以及你是否认识到它对于单元测试和模拟对象的静态类的重要性。

正如其他人已经指出的那样,static字段,即使是标记的字段readonly也可以使用反射设置,此外private可以使用反射调用构造函数。如果你需要阻止这些,要么你需要让调用代码在一个不太受信任的应用程序域空间中运行,要么你需要将你的类实现为static.

不过,一般来说,人们不会为了绕过你的限制而进行这种级别的反思,除非他们“真的需要”,例如,编写晦涩/极端的边缘案例单元测试。

于 2012-04-13T20:00:09.573 回答