Bagikan melalui


OpCodes.Readonly Bidang

Definisi

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:

  1. Pada durasi, tidak ada operasi pemeriksaan jenis yang dilakukan. Perhatikan bahwa biasanya ada pemeriksaan jenis implisit untuk ldelema instruksi dan stelem saat digunakan pada array jenis referensi. Tidak pernah ada pemeriksaan jenis run-time untuk kelas nilai, begitu juga readonly no-op dalam kasus itu.

  2. 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 untuk ldfldinstruksi , , ldfldastfld, call, atauconstrained callvirt .

  • pointer Sebagai parameter untuk ldobj instruksi atau ke salah ldind satu instruksi.

  • source Sebagai parameter untuk cpobj instruksi.

Semua operasi lain tidak diizinkan, termasuk stobjoperasi , , initobjatau 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:

Berlaku untuk