可以在C#中使用带有非默认构造函数的单例吗?

mil*_*lie 6 c# singleton parameter-passing

这是这个问题的一个微小差异:可以在C#中使用带有非默认构造函数的单例吗?

我有一个类,它的构造函数接受参数.我想制作这个单例,以便在初始化单例时获取参数,因此在每次检索实例时都不需要传递参数.

我的解决方案(这不是优雅的)是有一个CreateInstance()静态方法,它接受参数并构造单例实例.然后我将有另一个静态方法GetInstance(),它将无参数获取单例实例.在代码中,我需要CreateInstance在任何GetInstance 调用之前确保逻辑调用.但是,我无法在编译时强制执行此操作.但是,我可以在运行时检查GetInstance是否先调用异常CreateInstance.

无论如何,我可以通过编译时执行来实现这种行为吗?或者至少,是否有更好的方法来做同样的事情?

Jon*_*Jon 5

在编译时没有办法做到这一点,因为这就像询问编译器"你能证明代码X在执行代码Y之前永远不会被执行,存在多个线程吗?".它无法完成.

至于你的设计的运行时行为,我认为这是最好的.

您可以通过Func<SingletonType>在单例类中公开属性来使其稍微好一些.当有人要求单例实例并且尚未创建实例时,您的类将调用此"工厂方法"来构造单例.如果是工厂方法null,则使用某些默认参数抛出异常或(如果适用)构造.

这样做基本上推迟了单身人士的建设,直到第一次实际需要,所以这是一些改进.但基本原则是一样的.

更新:

正如LukeH指出的那样,这几乎就是什么Lazy<T>(仅限.NET 4).如果可能的话,使用那个而不是自己编写.

  • 您已经详细描述了`Lazy <T>`的工作方式:http://msdn.microsoft.com/en-us/library/dd642331.aspx (2认同)