Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 31028|Yanıt: 1

[Kaynak] .ctor ve .cctor of .net

[Bağlantıyı kopyala]
Yayınlandı 6.04.2017 14:56:38 | | | |
.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.





Önceki:Genel bağlam bağlı nesneler: ContextBoundObject ve genel sınıflar desteklenmez
Önümüzdeki:Bir sınıftaki statik, statik olmayan ve yapıcı yöntemlerin yürütme sırasının özeti
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com