Ketika saya memiliki kelas yang berisi konstruktor statis, apakah konstruktor tersebut dipanggil saat rakitan yang berisi kelas tersebut pertama kali dimuat atau saat referensi pertama ke kelas tersebut dipukul?
Jawaban:
Saat kelas diakses untuk pertama kalinya.
Konstruktor Statis (Panduan Pemrograman C #)
Konstruktor statis digunakan untuk menginisialisasi data statis apa pun, atau untuk melakukan tindakan tertentu yang hanya perlu dilakukan sekali. Ini dipanggil secara otomatis sebelum contoh pertama dibuat atau anggota statis dirujuk.
A static constructor is used to initialize any static data
TIDAK. Lebih baik digunakan static initializer
untuk menginisialisasi hal-hal statis.
Ini tidak sesederhana yang Anda harapkan meskipun ada dokumentasi yang jelas. Artikel Jon Skeet http://csharpindepth.com/Articles/General/Beforefieldinit.aspx membahas pertanyaan ini secara rinci.
Ringkasan:
Konstruktor statis dijamin akan dieksekusi segera sebelum referensi pertama ke anggota kelas itu - baik pembuatan instance atau metode / properti statis kelas itu sendiri.
Perhatikan bahwa initilaizer statis (jika tidak ada konstruktor statis) dijamin akan dijalankan kapan saja sebelum referensi pertama ke bidang tertentu.
Konstruktor statis dipanggil sebelum Anda menggunakan apa pun di kelas, tetapi kapan tepatnya itu terjadi, terserah implementasinya.
Dijamin akan dipanggil sebelum anggota statis pertama diakses dan sebelum instance pertama dibuat. Jika kelas tidak pernah digunakan, konstruktor statis tidak dijamin akan dipanggil sama sekali.
Jika metode statis dipanggil dari kelas induk, konstruktor statis tidak akan dipanggil, meskipun sudah ditentukan secara eksplisit. Berikut adalah contoh konstruktor b tidak dipanggil jika b.methoda () dipanggil.
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
Tampaknya ada gotcha dengan konstruktor statis yang dijawab di tempat lain tetapi butuh beberapa saat untuk mencerna penjelasan sederhana. Semua dokumen dan penjelasan mengklaim konstruktor / intializer statis "dijamin" untuk dijalankan sebelum kelas pertama dibuat atau kolom statis pertama direferensikan. Gotcha masuk saat Anda mencoba untuk meletakkan singleton statis di kelas yang membuat instance dari dirinya sendiri (ayam / telur). Dalam kasus ini, konstruktor statis akhirnya dipanggil setelah konstruktor instans - dan dalam kasus saya, konstruktor instans berisi kode yang mengandalkan beberapa data statis.
Konstruktor statis dipanggil setelah konstruktor contoh?
Konstruktor statis dapat dijalankan setelah konstruktor non-statis. Apakah ini bug kompilator?
(jawaban bagi saya adalah meletakkan singleton di kelas terpisah atau secara manual menginisialisasi data statis di konstruktor instance sebelum diperlukan)