防止类被实例化的最佳方法?
我需要知道如何防止类在.net中实例化?
我知道几个方法,比如制作抽象和静态类。
有没有更多的方法来实现这一目标?
如果你绝对不想要任何实例,那么使类静态是最好的方法。 这会阻止任何人创建实例。 该类将是密封和抽象的,并且不会有任何构造函数。
此外,该语言将注意到它是一个静态类,并阻止您在隐含实例的各个地方使用它,例如类型参数和变量。 这表明意图比仅具有私有构造函数更明确 – 这可能意味着在该类中创建了实例(例如,对于单例实现)。
哦,让类静态将阻止你在类中引入任何无意义的实例成员:)
有关静态类的更多信息,请参阅MSDN 。
将构造函数标记为private
, protected
或者如果从另一个程序集中使用,则标记为internal
将构造函数标记为private
。 当然,这并不妨碍类通过static
方法实例化,例如……
更实际的是,禁止类实例化的目的是什么。 如果它有一个单例 ,那么private
构造函数是合适的。 如果要强制进行子类化,那么使类abstract
更好; 如果它有一个带有实用程序方法的类,那么使它成为static
是一种方式(那么你只能有static
方法)。
我需要知道如何防止类在.net中实例化?
你的问题不明确。
你的意思是在运行时实例化? 使类abstract
或static
。
你的意思是代码中无法访问构造函数吗? 使构造函数private
。 但请注意,有人仍然可以使用reflection来获取构造函数上的句柄并在运行时实例化实例。
那么,你的意思是?
如果问题是:
如果你的课程不是
static
或abstract
,你如何才能使你的课程成为实例?
然后答案是实现单例模式 ,在.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。