.ctor herkes tarafından bilinir
.cctor tanımadığı için kolayca kötüye kullanılabilir
.cctor olarak adlandırılan bu madde, C# sözdiziminde statik bir yapıcıdır
Şekli gibi
.cctor ile .ctor arasındaki benzerlikler ve farklılıklar
1. Erişim hakları tanımlayıcılarını kamuya, özel vb. olarak kullanamazsınız, bu .ctor'dan farklıdır
2. Geri dönüş değeri olmamalıdır, bu .ctor ile aynıdır
3. Parametre olamaz, .ctor'un birden fazla parametresi olabilir
4. En fazla bir tane olabilir ve en az bir .ctor olmalı
5. Programcı .cctor çağrısının zamanlamasını kontrol edemez; bir anlamda programcı çağrının zamanlamasını kontrol edebilir
6. Programcılar doğrudan .cctor, .ctor çağrısı yapamaz Programcı yeni operatörü kullandığında, .ctor kesinlikle çağrılacaktır
.cctor çağrı zamanlaması:
Statik yapıcı, ilk örnek oluşturulmadan veya herhangi bir statik üye referans almadan önce otomatik olarak çağrılır. (Bu, MSDN'deki orijinal alıntıdır)
.cctor'un aynı program alanında yalnızca bir kez çağrıldığı açıktır; .ctor gibi bir nesne her kez çağrıldığında çağrılmaz.
.cctor kullanımı
Statik yapıcılar, herhangi bir statik veriyi başlatmak veya sadece bir kez yapılması gereken belirli işlemleri gerçekleştirmek için kullanılır.
Örneğin:
Aşağıdaki tüm kodlar Windows 7'de derlenmiştir, 2005 Sürüm moduna göre ve sonuçlar farklıysa, sürüm moduna geçip tekrar denemeyi düşünün
Bu kod segmentini derleyin ve ardından ILDISM kullanarak onu izleyin, metod tablosu şöyledir
.ctor(): void // Bu, derleyici tarafından otomatik olarak sağlanan sınıfın bir örnek oluşturucusudur
Main():void(string[]) //Program giriş noktası
Elbette, assemblerde .cctor yoktur ve derleyici, bir sınıfın başlatılması gereken statik alanlar olmadığında otomatik olarak .cctor fonksiyonları sağlamaz; bu, .ctor'dan farklıdır ve .ctor zaten her zaman vardır
Kodu değiştirin
Bu kodu derlerken bir uyarı olacak, ama bu önemli değil, önemli olan ILDASTOM ile assembly görüntülendiğinde beklenen .cctor, statik yapıcı görünmemesi!
Ne oldu?
Bu çıkarım yanlış mı?. CCTOR, bir sınıfı başlatmak için kullanılan statik bir alan değil mi?
Sakin olun, lütfen koduna bakın
Bu kod ile önceki kod arasındaki tek fark, statik alan i'nin başlangıç değerini değiştirmesi ve bir sonraki şeyin sihirli anı görmesi
Hadi DASM yapalım ve şaşırtıcı şekilde, çok istenen .cctor nihayet geldi!
.cctor uygulama koduna bakın ve şunu göreceksiniz:
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{ Kod boyutu 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Statik alanları örnekle getir :-) IL_0001: STSFLD int32 only_lonely. A::i IL_0006: ret. } // Metod A::.cctor sonu
Neden böyle? Olası nedenler, Int32 türünün varsayılan değerinin 0 olmasıdır ve derleyici bunu algılayıp .cctor kodu üretmemesi için optimize eder
referans
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Son olarak, özel fonksiyonel gereksinimleri uygulamak için .cctor fonksiyonunu kendimiz uygulayabiliriz
özet 1、. CTOR yapım yöntemidir; 2、. cctor, C#'da statik bir yapıcı olan bir tür başlatıcıdır; 3. C sınıfı oluşturulduğunda, önce bildirme anında atanan alana bir değer atar, sonra temel sınıfın üreticisini çağırır ve ardından aynı şekilde, en üst seviyedeki System.Object'e kadar kendini oluşturur ve ardından C'nin açık yapı yönteminde kodu çalıştırmak için geri gelir; bu çok özyinelemeli bir süreçtir.
|