'string const' vs. 'string hanya baca statis' di C #


Jawaban:


171

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.


25
1, Dan kesimpulan yang jelas, dari point-of-view praktis dan semantik: constseharusnya hanya digunakan untuk konstanta - konstanta menjadi nilai-nilai yang tidak pernah , pernah , pernah berubah.
LukeH

3
@ LukeH tidak pernah sedikit pun kuat. Saya tidak dapat memikirkan hal buruk yang akan terjadi jika seseorang mendeklarasikan string pribadi sebagai const dan mengubahnya di antara dua peristiwa kompilasi ulang.
Brenda Bell

5
@ Brenda: Saya akan mengakui bahwa saya memang menggunakan 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. ;)
LukeH

Bagaimana dengan kinerja dalam kasus string pada khususnya? Akankah setiap penggunaan const menghasilkan salinan baru dari sebuah string dalam memori?
Andrii

@Andrii tidak, string konstan dibuat sekali. Setiap penggunaan akan memiliki referensi yang sama di memori.
Migg

43

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.


19
Hal yang sangat menarik dari artikel ini - "Pada level tinggi, konstanta ditangani dengan jelas pada waktu kompilasi, sementara kolom hanya baca statis ditetapkan pada saat dievaluasi pada waktu proses. Fakta bahwa nilai konstanta digantikan oleh compiler Artinya, setiap library / assembly yang mereferensikan nilai konstanta perlu dikompilasi ulang jika nilai konstan berubah. Library yang mereferensikan kolom hanya baca statis akan mereferensikan kolom tersebut dan bukan nilainya, sehingga mereka akan mengambil setiap perubahan di kolom tersebut tanpa perlu untuk kompilasi ulang "
s_hewitt

1
Ya saya membacanya juga dan memiliki momen huh. Saya pasti tidak tahu itu.
spinon

Ini adalah versi cache Google: webcache.googleusercontent.com/…
spinon

2
Tautan referensi tidak lagi tersedia.
Salomon Zhang

Ini adalah pujian yang sangat baik untuk jawaban yang ditandai sebagai solusi. Mendefinisikan penggunaan sangat membantu. +1 dari saya.
Bonez024

11

const

public 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 readonly

public 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.


6

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.


Siapa "OQ" yang Anda bicarakan ini?
Peter Mortensen

"Pertanyaan asli"
Ben Aston

0

Anda dapat mengubah nilai a static readonly stringsaja di statickonstruktor kelas atau penginisialisasi variabel, sedangkan Anda tidak dapat mengubah nilai conststring di mana pun.


2
Saya tidak melihat bagaimana ini menambahkan apa pun di luar apa yang sudah dikatakan jawaban yang ada.
Gugatan Dana Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.