2010-06-28 9 views
7

Bu tektonlu uygulama doğru ve iplik korumalı mı? Bunun nasıl birBu Singleton uygulaması doğru ve iplik korumalı mı?

class Class 
{ 
    public static readonly Class Instance; 

    static Class() 
    { 
     Instance = new Class(); 
    } 

    private Class() {} 
} 
+1

Kurucu sonsuz çekmez olmaz mı? –

+1

@Robert, 'statik Sınıf()' ifadesi, yalnızca bir kez çağrılan statik kurucu içindir. 'New Class()' çağrısı, 'private Class()' örnek yapıcısını vurur. –

+0

Not: Statik ctor içinde ctor çağrısı örneği var (sınıf başlatıcısı). – Andreas

cevap

12

Teknik olarak Sürüm çalışması gerekir. Ancak, Singleton sınıfınızdaki bir kamusal alanı teşhir etmeyi önermem ve bir Mülk kullanmayı tercih ederim (yalnızca bir alıcıyla). Daha sonra değişiklik yapmanız gerekiyorsa, bu API'nizi ileride kanıtlamaya yardımcı olur. Tek bir sınıf uygulamasının da alt sınıflara ayrılmasının hemen hemen her zaman kötü bir fikir ve sorun olduğu için, tekil bir uygulamayı kapatmanızı öneririm. Eğer .NET 4 kullanıyorsanız

public sealed class Singleton 
{ 
    static readonly Singleton instance = new Singleton(); 

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

    static Singleton() { } 
    private Singleton() { } 
} 

, kendiniz için bu daha da kolaylaştırabilecek: .NET 3.5 veya daha önceki hedefleme eğer

Ben, şahsen, C# aşağıdaki kullanırsınız Lazy<T> aracılığıyla: - senin Singleton sınıf öncesinde "Örnek" özelliğinin erişmek için kullanılan diğer statik yöntemler olsa bile

public sealed class Singleton 
{ 
    private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton()); 
    private Singleton() {} 
    public static Singleton Instance { get { return instance.Value; } } 
} 

.NET 4 sürümü de tam tembel olma avantajına sahiptir. Özel, yuvalanmış bir sınıf kullanarak, tam bir .NET 3.5 sürümü de yapabilirsiniz. Jon Skeet demonstrated this on his blog.

+0

Özellikle Lazy çözümünü beğeniyorum. – Andreas

+0

@Andreas: Ben de - daha fazla "tembel" - çünkü sınıftaki statik bir yönteme erişmenin, yalnızca "Örnek" özelliğinin - somutlaşmaya neden olmayacağı. –

+0

+1 için "Lazy " –

2

Evet. Gelecekteki karışıklıklardan kaçınmak için 'sealed' sınıfını da yapardım.

1

Sen değişken bildiriminde başlatma yapmalıdır:

public static readonly Class Instance = new Class(); 
+1

Neden? ........... –

+0

Bu, ilk referansa kadar Örneklemenin yapısını geciktirir, bu da bir fark yaratabilir. Ayrıca bana daha temiz bir okuma. – Joe

+0

@Joe: İlk referansa kadar inşaatı geciktirmez. Aslında, statik yapıcıyı yerinde bırakmanız veya sınıfın daha önce işaretlenmesini sağlamanız gerekir, bu da aslında daha önce oluşturulmasına neden olabilir (ancak satır içi kurucuyu kullanmayı da tercih ederim). –