防止类被实例化的最佳方法?

时间:2012-04-13 12:50:02

标签: c#

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

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

有没有更多方法可以达到这个目的?

5 个答案:

答案 0 :(得分:19)

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

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

哦,让类静态化将阻止你在课堂上引入任何毫无意义的实例成员:)

有关静态类的详细信息,请参阅MSDN

答案 1 :(得分:14)

标记构造函数privateprotected或者是否使用其他程序集internal

答案 2 :(得分:7)

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

更实际的是,禁止类实例化的目的是什么。如果要使用单例,那么private构造函数是合适的。如果强制进行子类化,则使类abstract更好;如果有一个带有实用方法的类,那么static是一种方式(那么你只能有static个方法)。

答案 3 :(得分:3)

  

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

你的问题不明确。

你的意思是在运行时实例化?上课abstractstatic

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

那么,你的意思是什么?

答案 4 :(得分:2)

如果问题是:

  

如果没有上课,你如何才能使你的班级成为实例   是static还是abstract

然后答案是实现singleton pattern,在.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

一般来说,人们不会为了克服你的约束而烦恼这种反射水平,除非他们'真的需要',例如,编写模糊/极端条纹单元测试。