2012-10-01 78 views
7

辛格尔顿用C#实现的可能是这样的:静态属性和单例之间有什么区别?

public class Singleton 
{ 
    private static Singleton instance; 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new Singleton(); 
     } 
     return instance; 
     } 
    } 
} 

如果我使用静态实现它想:

public static class Globals{ 
    public static Singleton Instance = new Singleton(); 
} 
这样

,应用程序还应该只得到一个实例整个应用程序。 那么这两种方法有什么区别?为什么不直接使用静态成员(更简单直接)?

回答

8

如果使用第二种方法:

public static class Globals{ 
    public static Singleton Instance = new Singleton(); 
} 

没有什么防止有人从做:

Singleton anotherInstance = new Singleton(); // Violates singleton rules 

还没有得到相同的延迟初始化您的第一个版本(尝试)实现,再加上你使用的是一个公共字段,如果你需要改变取值时发生的情况,它将在未来不允许你具有相同的灵活性。

需要注意的是.NET 4提供了一个潜在的更好的方法,使一个单:

public class Singleton 
{ 
    private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(()=> new Singleton()); 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     return instance.Value; 
     } 
    } 
} 

这是很好的,因为它是完全懒完全线程安全的,但也很简单。

+0

我们需要声明*静态构造函数*在这里线程安全的? –

+0

@CongLong不与'懒惰'版本。这是非常好的,它提供了适当的线程安全性和完美的懒惰实例化,并带有一个简单的API。 –

+0

啊,是的,我明白了,+1 –

-1

下面是静态的,单件之间的一些差异:

  1. 单例是一个模式而静态为关键字。
  2. 单例类可以有静态和非静态方法,但静态类只能有静态成员和方法。
  3. 我们可以在Singleton类中实现接口,但在静态类中我们不能实现接口。
  4. 我们可以扩展Singleton类,而我们不能使用静态类,即Singleton类可以从任何类的类中派生。

更多static vs Singleton

相关问题