2012-03-16 18 views
5

here numaralı belirtilen Tekton uygulamasından geçiyordum. Statik kurucuların, ilk durağan yöntem çağrısı öncesinde veya nesnenin başlatılmasından önce gerçekleştirilmesini anlıyorum, ancak burada kullanıldığını anlamamış (yorumlardan bile). Birisi bunu anlamama yardımcı olabilir mi?Boş statik yapıcı ile tekil uygulama

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

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Singleton() 
    { 
    } 

    private Singleton() 
    { 
    } 

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

Aşağıdaki madde altındaki mermi noktalarında açıklanmıştır: 'tür başlatıcıların tembelliği, yalnızca tür tarafından 'beforefieldinit' adı verilen özel bir bayrakla işaretlenmediğinde garanti edilir. Ne yazık ki, C# derleyici (en az .NET 1.1 çalışma zamanında sağlanan), statik yapıcı (örneğin bir kurucu gibi görünüyor ama statik olarak işaretlenmiş bir blok) olmayan tüm türleri işaretler 'beforefieldinit'. “Yeni Singleton()” un mümkün olduğu kadar geç (tembel) yapılmasını istiyor ve bunu yapmak için C# derleyicisini almanın tek yolu boş bir statik kurucu sağlamaktır. – porges

+0

Cehaletimi bağışla. "Tip başlatıcıların tembelliği" nedir. İlk istek üzerine başlatılıyor mu? – Nemo

+0

Tam olarak. Yalnızca bu durumda garanti edilir, aksi takdirde çalışma zamanı, tür yüklenir yüklenmez, tür başlatıcıyı istediği zaman çalıştırabilir. Daha uzun bir açıklama için Jay'in cevabındaki bağlantıya bakın. – porges

cevap

7

statik yapıcı yalnızca derleyici beforefieldinit bayrağı set değil yapmak için bir yol olarak, bu başka bir şey önce veya sonra çağrılmalıdır sırayla yoktur. Bu burada

fazla bilgi: What does beforefieldinit flag do?

mantık tekil nesnenin başlatma tembellik bir ölçüsünü elde etmektir. beforefieldinit ayarlanmışsa (statik kurucu tanımlanmadığı için), koşullu olarak Singleton.Instance'a atıfta bulunan bir yöntemin yürütülmesi, koşulun yerine getirilmemesine ve bu çağrının hiçbir zaman yapılmamasına rağmen, tekil nesnesini başlatabilir. (Statik yapıcı tanımlanır çünkü - boş bile olsa) Diğer yandan

public void Foo() 
{ 
    if (false) 
    { 
     var bar = Singleton.Instance.SomeMethod(); 
    } 
} 

, beforefieldinit ayarlanmazsa, daha sonra aynı yöntem sadece tekil örneği durum ise başlatılması neden olacak yürütme memnun ve bu çağrı aslında yapıldı.

O makalede tekil sınıfı tanımlamak herhangi diğer statik üyesi diyerek de Instance başlatıldı neden olur, çünkü bu özel uygulama tamamen tembel olmadığını işaret ederek devam ediyor.

İlgili konular