.NET的一个明显的单例实现?

我在考虑懒惰单例初始化的经典问题 – 整个问题的低效率:

if (instance == null) { instance = new Foo(); } return instance; 

任何知道Singleton是什么的人都熟悉这个问题(你只需要if一次)。 这是微不足道但令人恼火的。

所以,我想到了一个替代解决方案,至少对于.NET来说(尽管它应该可以在任何具有等效函数指针的地方工作:

 public class Foo { private delegate Foo FooReturner(); private static Foo innerFoo; private static FooReturner fooReturnHandler = new FooReturner(InitialFooReturner); public static Foo Instance { get { return fooReturnHandler(); } } private static Foo InitialFooReturner() { innerFoo = new Foo(); fooReturnHandler = new FooReturner(NewFooReturner); return innerFoo; } private static Foo NewFooReturner() { return innerFoo; } } 

简而言之 – Instance返回一个委托方法。 委托最初设置为初始化实例的方法,然后将委托更改为指向简单的Return方法。

现在,我喜欢认为我的工作并不可怕,但我并不担心自己很棒。 我没有在任何地方看到这个代码的例子。

因此,我得出结论,我错过了一些东西。 重要的东西。 要么整个​​问题太过微不足道,要么不必考虑太多,或者这会造成毁灭宇宙的可怕事情。 或者我在搜索时失败了,因此没有看到数百名开发人员使用这种方法。 不管怎样,还有什么东西。

我希望Stack Overflow这里的优秀人员可以让我知道什么(撇开关于是否应该使用Singleton的争议)。

编辑澄清:

这不是性能代码(尽管如果设计主动降低性能超出传统模型,那么知道这将是有趣的)。

它纯粹是作为概念validation而编写的,我进一步意识到它不是正确的线程安全。 有什么理由说它为什么不能通过它的本质来制作线程安全的?

这是C#中的规范,线程安全,懒惰的Singleton模式 :

 public sealed class Singleton { Singleton(){} public static Singleton Instance { get { return Nested.instance; } } class Nested { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Nested() {} internal static readonly Singleton instance = new Singleton(); } } 

为了防止必须复制单例代码,您可以使类型通用,如下所示:

 public abstract class Singleton where T: class, new() { public static T Instance { get { return Nested.instance; } } private class Nested { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Nested() { } internal static readonly T instance = new T(); } } public sealed class MyType : Singleton { } class Program { static void Main() { // two usage pattterns are possible: Console.WriteLine( ReferenceEquals( Singleton.Instance, MyType.Instance ) ); Console.ReadLine(); } } 

你测量过性能吗?

你是否相信额外的函数调用比if更便宜?

我同意其他人使用静态ctor很适合这种初始化。 这也将摆脱你所拥有的固有竞争条件.net guarentees静态构造函数只会被调用一次。

整个问题的无效:……

什么效率低下?

这些指令将导致汇编代码的速度极快。 我完全相信通过尝试“优化”这一点没有任何好处。 即使你想出更快的东西,它也会付出相当大的复杂性。

除非您确实有正确的证据certificate此代码会影响您的性能,否则您应该使用最简单的方法来解决您的问题。

我刚刚开始使用c#编程(来自C ++,这是一口新鲜空气),这就是我用来实现单例模式的方法。

 public sealed class MyClass { #region make singleton static readonly Lazy _singleton = new Lazy(() => new MyClass()); public static MyClass Singleton { get { return _singleton.Value; } } private MyClass() { Initialize() }; #endregion Initialize() { /*TODO*/ }; } 

我发现创建单例的最佳方法是:

 public class Singleton { static public Singleton Instance { get; } = new Singleton(); private Singleton() { ... } } 

它非常简洁,更重要的是,它也是线程安全的 ,随着应用程序的成熟,检测和修复会非常麻烦。


更新:显示它是懒惰的……

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SingletonTest { class MySingleton { static public MySingleton Instance { get; } = new MySingleton(); private MySingleton() { Console.WriteLine("Created MySingleton"); } public void DoSomething() { Console.WriteLine("DoSomething"); } } class Program { static void Main(string[] args) { Console.WriteLine("Starting Main"); MySingleton.Instance.DoSomething(); } } } 

输出:

 Starting Main Created MySingleton DoSomething 

我总是使用这个常规(非懒惰)(你可以像其他示例一样嵌套):(需要using System.Reflection;

 public class SingletonBase where T : class { static SingletonBase() { } public static readonly T Instance = typeof(T).InvokeMember(typeof(T).Name, BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, null, null) as T; }