.ctor dikenal oleh semua orang
.cctor tidak dikenal dan dapat dengan mudah disalahgunakan
Apa yang disebut .cctor adalah konstruktor statis dalam sintaks C#
Bentuk seperti
Persamaan dan perbedaan antara .cctor dan .ctor
1. Anda tidak dapat memiliki pengidentifikasi hak akses publik, pribadi, dll., yang tidak dapat digunakan, yang berbeda dari .ctor
2. Tidak boleh ada nilai pengembalian, yang sama dengan .ctor
3. Tidak ada parameter, .ctor dapat memiliki banyak parameter
4. Paling banyak hanya satu, dan harus ada setidaknya satu .ctor
5. Programmer tidak dapat mengontrol waktu panggilan .cctor, dalam arti tertentu, programmer dapat mengontrol waktu panggilannya
6. Programmer tidak dapat langsung memanggil .cctor, .ctor Ketika programmer menggunakan operator baru, .ctor pasti akan dipanggil
Waktu panggilan .cctor:
Konstruktor statis secara otomatis dipanggil sebelum instans pertama dibuat atau anggota statis apa pun direferensikan. (Ini adalah kutipan asli di MSDN)
Jelas bahwa .cctor hanya dipanggil sekali dalam domain program yang sama, daripada dipanggil setiap kali objek dibuat instance seperti .ctor
Penggunaan .cctor
Konstruktor statis digunakan untuk menginisialisasi data statis apa pun, atau untuk melakukan operasi tertentu yang hanya perlu dilakukan sekali.
Sebagai contoh:
Semua kode berikut dikompilasi dalam mode Windows 7, vs 2005 Release, dan jika hasilnya berbeda, pertimbangkan untuk beralih ke mode rilis dan coba lagi
Kompilasi segmen kode ini dan kemudian gunakan ILDISM untuk melihatnya, tabel metodenya adalah sebagai berikut
.ctor(): void // Ini adalah konstruktor instance dari kelas yang disediakan secara otomatis oleh compiler
Main():void(string[]) //Titik masuk program
Jelas, tidak ada .cctor dalam rakitan, dan kompiler tidak akan secara otomatis menyediakan fungsi .cctor ketika kelas tidak memiliki bidang statis yang perlu diinisialisasi, yang berbeda dari .ctor, yang selalu ada
Ubah kode
Mengkompilasi kode ini, akan ada peringatan, tetapi itu tidak penting, yang penting adalah saat melihat perakitan dengan ILDASTOM, .cctor yang diharapkan, konstruktor statis tidak muncul!
Apa yang terjadi?
Apakah kesimpulannya salah?. CCTOR bukan bidang statis yang digunakan untuk menginisialisasi kelas?
Tenang saja, silakan lihat kodenya
Satu-satunya perbedaan antara kode ini dan yang sebelumnya adalah mengubah nilai awal bidang statis i, dan hal berikutnya adalah menyaksikan momen ajaib
Mari kita DASM, dan yang mengejutkan kami, .cctor yang banyak diminta akhirnya ada di sini!
Lihat kode implementasi .cctor dan Anda akan melihat:
.method private hidebysig specialname rtspecialname static void .cctor() cil dikelola
{ Ukuran kode 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instans bidang statis :-) IL_0001: STSFLD INT32 only_lonely. A::i IL_0006: ret } // akhir metode A::.cctor
Mengapa demikian? Alasannya yang mungkin adalah bahwa nilai default dari jenis Int32 adalah 0, dan kompiler mendeteksi ini dan mengoptimalkannya agar tidak menghasilkan kode .cctor
referensi
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Akhirnya, kita dapat mengimplementasikan fungsi .cctor sendiri untuk menerapkan persyaratan fungsional khusus
ringkasan 1、. CTOR adalah metode konstruksi; 2、. cctor adalah jenis inisialisasi, yang merupakan konstruktor statis di C#; 3. Ketika kelas C dibuat, pertama-tama akan menetapkan nilai ke bidang yang ditetapkan pada saat deklarasi, dan kemudian memanggil konstruktor kelas dasar, dan kemudian membangun dirinya sendiri dengan cara yang sama, sampai ke System.Object tingkat atas, dan kemudian kembali untuk mengeksekusi kode dalam metode konstruksi eksplisit C, yang merupakan proses rekursif.
|