Statik bir oluşturucu içeren bir sınıfa sahip olduğumda, bu kurucu, sınıfı içeren derleme ilk yüklendiğinde veya bu sınıfa ilk başvuru vurulduğunda çağrılır mı?
Yanıtlar:
Sınıfa ilk kez erişildiğinde.
Statik Oluşturucular (C # Programlama Kılavuzu)
Statik bir yapıcı, herhangi bir statik veriyi başlatmak veya yalnızca bir kez gerçekleştirilmesi gereken belirli bir eylemi gerçekleştirmek için kullanılır. İlk örnek oluşturulmadan veya herhangi bir statik üyeye başvurulmadan önce otomatik olarak çağrılır.
A static constructor is used to initialize any static data
HAYIR. static initializer
Statik şeyleri başlatmak için kullanmak daha iyidir.
Basit belgelere rağmen beklediğiniz kadar basit değil. Jon Skeet'in http://csharpindepth.com/Articles/General/Beforefieldinit.aspx makalesi bu soruya ayrıntılı olarak giriyor.
Özet:
Statik oluşturucunun, o sınıfın bir üyesine yapılan ilk başvurudan hemen önce çalıştırılması garanti edilir - örneğin oluşturulması veya sınıfın kendi statik yöntemi / özelliği.
Statik başlatıcıların (statik kurucu yoksa) belirli bir alana ilk başvurmadan önce herhangi bir zamanda çalıştırılmasının garanti edildiğini unutmayın .
Statik kurucu, sınıfta herhangi bir şey kullanmadan önce çağrılır, ancak bunun tam olarak ne zaman olacağı uygulamaya bağlıdır.
İlk statik üyeye erişilmeden ve ilk örnek oluşturulmadan önce çağrılması garanti edilir. Sınıf hiçbir zaman kullanılmazsa, statik oluşturucunun çağrılması garanti edilmez.
Statik yöntemin üst sınıftan çağrılması durumunda, açıkça belirtilmesine rağmen statik yapıcı çağrılmayacaktır. Burada bir örnek b yapıcısı, b.methoda () çağrılırsa çağrılmaz.
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
Statik kurucularla ilgili başka bir yerde yanıtlanan ancak basit bir açıklamayı sindirmesi biraz zaman alan bir sorun var gibi görünüyor. Tüm belgeler ve açıklamalar, statik oluşturucu / başlatıcıların, birinci sınıf başlatılmadan veya ilk statik alana başvurulmadan önce çalışmasının "garantili" olduğunu iddia eder. Gotcha, sınıfa kendi örneğini (tavuk / yumurta) oluşturan statik bir singleton koymaya çalıştığınızda gelir. Bu durumda, statik oluşturucu, örnek oluşturucudan sonra çağrılır ve benim durumumda örnek oluşturucu, bazı statik verilere dayanan kod içeriyordu.
Statik yapıcı, örnek oluşturucudan sonra mı çağrıldı?
Statik yapıcı, statik olmayan yapıcıdan sonra çalışabilir. Bu bir derleyici hatası mı?
(benim için cevap, singleton'ı ayrı bir sınıfa koymak veya gerekli olmadan önce örnek oluşturucudaki statik verileri manuel olarak başlatmaktı)