Mengapa kompiler menyimpan nilai konstan dalam metadata rakitan? Apakah mereka langsung disematkan ke kode Bahasa Menengah dari metadata majelis?
c#
clr
compilation
Arun
sumber
sumber
Jawaban:
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.
sumber
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.
sumber
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.
sumber
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.
sumber