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

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

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

有没有更多的方法来实现这一目标?

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

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

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

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

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

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

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

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

你的问题不明确。

你的意思是在运行时实例化? 使类abstractstatic

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

那么,你的意思是?

如果问题是:

如果你的课程不是staticabstract ,你如何才能使你的课程成为实例?

然后答案是实现单例模式 ,在.NET 4+中,这可以通过以下方式轻松完成:

 public sealed class myClass { private static readonly Lazy lazyInstance = new Lazy(() => new myClass()); public static Instance { get { return lazyInstance.Value; } } private myClass() { // constructor logic here } } 

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

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

 private static readonly myClass instance = new myClass(); public static Instance { get { return instance; } } // rest of code remains the same 

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

总而言之,问题可能是询问您是否知道单例模式以及您是否认识到它对于unit testing和模拟对象的静态类的重要性。

正如其他人已经指出的那样, static字段,甚至那些标记为readonly字段都可以使用reflection进行设置,此外可以使用reflection调用private构造函数。 如果您需要阻止这些,您需要使调用代码在不太受信任的应用程序域空间中运行,或者您需要将您的类实现为static

一般来说,人们不会为了克服你的约束而烦恼这种reflection水平,除非他们“真的需要”例如,编写模糊/极端边缘案例unit testing。