OpCodes.Readonly Bidang
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menentukan bahwa operasi alamat array berikutnya tidak melakukan pemeriksaan jenis pada durasi, dan mengembalikan penunjuk terkelola yang mutabilitasnya dibatasi.
public: static initonly System::Reflection::Emit::OpCode Readonly;
public static readonly System.Reflection.Emit.OpCode Readonly;
staticval mutable Readonly : System.Reflection.Emit.OpCode
Public Shared ReadOnly Readonly As OpCode
Nilai Bidang
Keterangan
Tabel berikut mencantumkan format rakitan heksadesimal dan bahasa perantara Microsoft (MSIL) instruksi, bersama dengan ringkasan referensi singkat:
Format | Format Rakitan | Deskripsi |
---|---|---|
FE 1E | baca saja. | Tentukan bahwa operasi alamat array berikutnya tidak melakukan pemeriksaan jenis pada durasi, dan mengembalikan penunjuk terkelola dengan mutabilitas terbatas. |
Awalan ini hanya dapat muncul segera sebelum ldelema
instruksi dan panggilan ke metode khusus Address
pada array. Efeknya pada operasi berikutnya adalah dua kali lipat:
Pada durasi, tidak ada operasi pemeriksaan jenis yang dilakukan. Perhatikan bahwa biasanya ada pemeriksaan jenis implisit untuk
ldelema
instruksi danstelem
saat digunakan pada array jenis referensi. Tidak pernah ada pemeriksaan jenis run-time untuk kelas nilai, begitu jugareadonly
no-op dalam kasus itu.Pemverifikasi memperlakukan hasil operasi alamat sebagai penunjuk terkelola dengan mutabilitas terbatas.
Penunjuk dikatakan memiliki mutabilitas terbatas karena jenis yang menentukan mengontrol apakah nilai dapat dimutasi. Untuk kelas nilai yang tidak mengekspos bidang publik atau metode yang memperbarui nilai di tempat, penunjuk bersifat baca-saja (karenanya nama awalan). Secara khusus, kelas yang mewakili jenis primitif (misalnya, System.Int32) tidak mengekspos mutator dan dengan demikian bersifat baca-saja.
Pointer terkelola yang dibatasi dalam mode ini hanya dapat digunakan dengan cara berikut:
object
Sebagai parameter untukldfld
instruksi , ,ldflda
stfld
,call
, atauconstrained callvirt
.pointer
Sebagai parameter untukldobj
instruksi atau ke salahldind
satu instruksi.source
Sebagai parameter untukcpobj
instruksi.
Semua operasi lain tidak diizinkan, termasuk stobj
operasi , , initobj
atau mkrefany
, atau instruksi stind
apa pun.
Tujuan awalan readonly
adalah untuk menghindari pemeriksaan jenis saat mengambil elemen dari array dalam kode generik. Misalnya, ekspresi arr[i].m()
, di mana jenis elemen array arr
adalah jenis generik yang telah dibatasi untuk memiliki antarmuka dengan metode m
, mungkin dikompilasi ke MSIL berikut.
ldloc arr
ldloc i
readonly.
ldelema !0 // Loads the pointer to the object.
… // Load the arguments to the call.
constrained. !0
callvirt m
readonly
Tanpa awalan, ldelema
instruksi akan melakukan pemeriksaan jenis dalam kasus di mana !0 adalah jenis referensi. Tidak hanya jenis ini memeriksa tidak efisien, tetapi secara semantik salah. Pemeriksaan ldelema
jenis adalah kecocokan yang tepat, yang terlalu kuat. Jika array memegang subkelas jenis !0, kode di atas akan gagal pemeriksaan jenis.
Alamat elemen array diambil, alih-alih elemen itu sendiri, untuk memiliki handel untuk arr[i]
itu berfungsi untuk jenis nilai dan jenis referensi, dan dengan demikian dapat diteruskan ke constrained callvirt
instruksi.
Secara umum tidak aman untuk melewati pemeriksaan run-time jika array memegang elemen dari jenis referensi. Agar aman, perlu untuk memastikan bahwa tidak ada modifikasi pada array yang dilakukan melalui penunjuk ini. Aturan pemverifikasi memastikan hal ini. Pointer terkelola terbatas dapat diteruskan sebagai objek panggilan metode instans, sehingga tidak secara ketat berbicara baca-saja untuk jenis nilai, tetapi tidak ada masalah keamanan jenis untuk jenis nilai.
Metode berikut Emit kelebihan beban dapat menggunakan readonly
opcode: