Di C #, apa perbedaannya
static readonly string MyStr;
dan
const string MyStr;
?
Di C #, apa perbedaannya
static readonly string MyStr;
dan
const string MyStr;
?
Jawaban:
Saat Anda menggunakan conststring, kompilator menyematkan nilai string pada waktu kompilasi .
Oleh karena itu, jika Anda menggunakan constnilai dalam rakitan yang berbeda, kemudian memperbarui rakitan asli dan mengubah nilainya, rakitan lain tidak akan melihat perubahan sampai Anda mengkompilasinya ulang .
Sebuah static readonlystring adalah bidang yang normal yang akan menatap runtime. Oleh karena itu, jika nilai bidang diubah di perakitan berbeda, perubahan akan terlihat segera setelah perakitan dimuat, tanpa kompilasi ulang.
Ini juga berarti bahwa static readonlystring dapat menggunakan anggota non-konstanta, seperti Environment.UserNameatau DateTime.Now.ToString(). Sebuah conststring hanya dapat diinisialisasi menggunakan konstanta atau literal lain.
Selain itu, static readonlystring dapat disetel dalam konstruktor statis; sebuah conststring yang hanya dapat inline diinisialisasi.
Perhatikan bahwa a static stringdapat dimodifikasi; Anda harus menggunakan static readonlysebagai gantinya.
constseharusnya hanya digunakan untuk konstanta - konstanta menjadi nilai-nilai yang tidak pernah , pernah , pernah berubah.
private constnilai-nilai yang sebenarnya bukan konstanta; pada dasarnya itu menyalahgunakan constuntuk tujuan pengoptimalan mikro. Saya akan mempertahankan pernyataan "tidak akan pernah, selamanya" , meskipun itu membuat saya munafik. ;)
Berikut adalah rincian pro dan kontra yang bagus :
Jadi, tampaknya konstanta harus digunakan ketika nilainya sangat kecil kemungkinannya akan berubah, atau jika tidak ada aplikasi / lib eksternal yang akan menggunakan konstanta. Bidang hanya baca statis harus digunakan saat penghitungan waktu proses diperlukan, atau jika konsumen eksternal merupakan faktor.
constpublic const string MyStr;
adalah konstanta waktu kompilasi (Anda dapat menggunakannya sebagai parameter default untuk parameter metode misalnya), dan tidak akan disamarkan jika Anda menggunakan teknologi seperti itu
static readonlypublic static readonly string MyStr;
adalah runtime konstan. Artinya, dievaluasi ketika aplikasi diluncurkan dan bukan sebelumnya. Inilah sebabnya mengapa tidak dapat digunakan sebagai parameter default untuk sebuah metode (kesalahan kompilasi) misalnya. Nilai yang disimpan di dalamnya dapat dikaburkan.
OQ menanyakan tentang static stringvs.const . Keduanya memiliki kasus penggunaan yang berbeda (meskipun keduanya diperlakukan sebagai statis).
Gunakan konstanta hanya untuk nilai yang benar-benar konstan (misalnya kecepatan cahaya - tetapi ini pun bervariasi tergantung pada medium). Alasan untuk pedoman ketat ini adalah bahwa nilai const diganti ke dalam penggunaan const di majelis yang mereferensikannya, yang berarti Anda dapat memiliki masalah versi jika const berubah di tempat definisinya (yaitu seharusnya tidak menjadi konstanta Lagipula). Perhatikan bahwa ini bahkan memengaruhi private constbidang karena Anda mungkin memiliki basis dan subkelas di majelis yang berbeda dan bidang pribadi diwarisi .
Bidang statis terikat dengan jenis yang dideklarasikan di dalamnya. Mereka digunakan untuk mewakili nilai yang harus sama untuk semua contoh dari tipe tertentu. Kolom ini dapat ditulis sebanyak yang Anda suka (kecuali ditentukan hanya untuk dibaca).
Jika Anda bermaksud static readonlyvs const, maka saya akan merekomendasikan static readonlyuntuk hampir semua kasus karena lebih banyak bukti di masa depan.
Anda dapat mengubah nilai a static readonly stringsaja di statickonstruktor kelas atau penginisialisasi variabel, sedangkan Anda tidak dapat mengubah nilai conststring di mana pun.