Konstanta dalam C #

9

Mengapa kompiler menyimpan nilai konstan dalam metadata rakitan? Apakah mereka langsung disematkan ke kode Bahasa Menengah dari metadata majelis?

Arun
sumber
1
ini tidak benar-benar membahas 'mengapa' tetapi tetap menarik: stackoverflow.com/a/2128633/128384
stijn
Saya bingung dengan pertanyaan ini. Di mana lagi mereka akan disimpan jika tidak di metadata? Bisakah Anda mengklarifikasi pertanyaan?
Eric Lippert

Jawaban:

4

Cara terbaik untuk memikirkannya yang saya temukan adalah: Pada waktu kompilasi, sebuah const dikonversi ke literal di mana ia digunakan.

Satu-satunya alasan masuk ke manifes dalam majelis yang didefinisikan adalah untuk membuatnya dapat diakses oleh konsumen. Ini adalah bagian dari tipe yang diberikan dan metadata tipe itu disimpan dalam rakitannya, bukan rakitan yang mengkonsumsinya.

Jadi, ini adalah literal in-line dalam konsumsi, dan properti atau bidang enkapsulasi jenis habis pakai dalam metadata.

Jimmy Hoffa
sumber
2

Saya meneliti sendiri cukup lama dan menemukan dari sebuah buku bahwa ini dapat menjadi alasan ...

Karena nilai konstan tidak pernah berubah, konstanta dianggap sebagai bagian dari tipe yang mendefinisikan. Karenanya, mendefinisikan konstanta menciptakan metadata.

Arun
sumber
1

Saya pikir Anda mencampur dua majelis.

Konstanta hanya disimpan dalam metadata dalam rakitan di mana ia didefinisikan . Metadata berisi informasi tentang semua jenis dan anggota dalam sebuah majelis dan konstanta adalah anggota.

Tidak ada informasi tentang konstanta yang disimpan dalam rakitan tempat ia digunakan . Nilai konstan digunakan langsung di IL sama seperti jika Anda telah menulis angka konstan atau string langsung di sumbernya.

Contoh: Salah satu aplikasi saya menggunakan banyak konstanta untuk mengidentifikasi tabel dan bidang basis data. Saya punya satu rakitan yang hanya berisi semua konstanta.

Ketika saya membangun aplikasi saya menambahkan referensi ke perakitan "konstanta" di Visual Studio. Karena rakitan hanya berisi konstanta tidak ada referensi untuk itu dalam aplikasi saya dan rakitan "konstanta" tidak diperlukan pada saat run-time.

adrianma
sumber
2
Ini tidak benar-benar menjelaskan mengapa konstanta disimpan dalam metadata. Itu menari di sekitar mengapa, tapi saya tidak berpikir OP membingungkan dua majelis sama sekali. Anda melihatnya sebagai masalah dua majelis karena Anda menggunakan dua majelis, tetapi saya tidak berpikir bahwa praktik itu biasa; konstanta biasanya didefinisikan dalam rakitan yang sama di mana mereka digunakan.
Robert Harvey
@RobertHarvey Anggapan Anda tentang kasus tipikal terlalu melebih-lebihkan keahlian banyak rekan kerja C # kami, saya telah berkali-kali harus menjelaskan apa arti const kepada kolega dan mengapa Anda tidak memanggil mereka lintas majelis.
Jimmy Hoffa
1

Konstanta dikenal pada waktu kompilasi dan kemudian disimpan dalam metadata rakitan. Ini berarti Anda hanya dapat mendefinisikan konstanta untuk tipe primitif.

Ya mereka langsung dimuat dari metadata. Tidak akan ada alokasi memori saat runtime.

Striker
sumber
1
Desimal bukan tipe primitif tetapi Anda dapat membuat konstanta desimal. Dan Anda dapat membuat konstanta dari jenis referensi apa pun asalkan konstanta nol.
Eric Lippert