Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 31028|Jawab: 1

[Sumber] .ctor dan .cctor dari .net

[Salin tautan]
Diposting pada 06/04/2017 14.56.38 | | | |
.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.





Mantan:Objek terikat konteks generik: ContextBoundObject dan kelas generik tidak didukung
Depan:Ringkasan urutan eksekusi metode statis, non-statis, dan konstruktif dalam suatu kelas
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com