OpCodes.Constrained 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.
Membatasi jenis di mana panggilan metode virtual dilakukan.
public: static initonly System::Reflection::Emit::OpCode Constrained;
public static readonly System.Reflection.Emit.OpCode Constrained;
staticval mutable Constrained : System.Reflection.Emit.OpCode
Public Shared ReadOnly Constrained As OpCode
Nilai Bidang
Keterangan
Tabel berikut ini mencantumkan format rakitan bahasa perantara (MSIL) heksadesimal instruksi, bersama dengan ringkasan referensi singkat:
| Format | Format Rakitan | Deskripsi |
|---|---|---|
<
T
> FE 16 |
Dibatasi. thisType |
Panggil metode virtual pada jenis yang dibatasi untuk diketik T. |
Awalan constrained hanya diizinkan pada instruksi callvirt.
Status tumpukan MSIL pada titik ini harus sebagai berikut:
Pointer terkelola,
ptr, didorong ke tumpukan. Jenisptrharus berupa penunjuk terkelola (&) untukthisType. Perhatikan bahwa ini berbeda dari kasus instruksicallvirtyang belum diprefiks, yang mengharapkan referensithisType.Argumen metode
arg1melaluiargNdidorong ke tumpukan, sama seperti instruksicallvirtyang tidak diprefiks.
Awalan constrained dirancang untuk memungkinkan instruksi callvirt dibuat dengan cara yang seragam terlepas dari apakah thisType adalah jenis nilai atau jenis referensi.
Ketika instruksi callvirtmethod telah diawali oleh constrainedthisType, instruksi dijalankan sebagai berikut:
Jika
thisTypeadalah jenis referensi (dibandingkan dengan jenis nilai) makaptrdidereferensikan dan diteruskan sebagai penunjuk 'ini' kecallvirtmethod.Jika
thisTypeadalah jenis nilai danthisTypemenerapkanmethodmakaptrditeruskan tanpa dimodifikasi sebagai penunjuk 'ini' ke instruksicallmethod, untuk implementasimethodolehthisType.Jika
thisTypeadalah jenis nilai danthisTypetidak menerapkanmethodmakaptrdidereferensikan, dikotak, dan diteruskan sebagai penunjuk 'ini' ke instruksicallvirtmethod.
Kasus terakhir ini hanya dapat terjadi ketika method ditentukan pada Object, ValueType, atau Enum dan tidak ditimpa oleh thisType. Dalam hal ini, tinju menyebabkan salinan objek asli dibuat. Namun, karena tidak ada metode Object, ValueType, dan Enum mengubah status objek, fakta ini tidak dapat dideteksi.
Awalan constrained mendukung generator IL yang membuat kode generik. Biasanya instruksi callvirt tidak valid pada jenis nilai. Sebaliknya diperlukan bahwa pengkompilasi IL secara efektif melakukan transformasi 'ini' yang diuraikan di atas pada waktu kompilasi, tergantung pada jenis ptr dan metode yang dipanggil. Namun, ketika ptr adalah jenis generik yang tidak diketahui pada waktu kompilasi, tidak mungkin untuk membuat transformasi ini pada waktu kompilasi.
Opcode constrained memungkinkan pengkompilasi IL untuk melakukan panggilan ke fungsi virtual dengan cara yang seragam terlepas dari apakah ptr adalah jenis nilai atau jenis referensi. Meskipun ditujukan untuk kasus di mana thisType adalah variabel jenis generik, awalan constrained juga berfungsi untuk jenis nongenerik dan dapat mengurangi kompleksitas menghasilkan panggilan virtual dalam bahasa yang menyembunyikan perbedaan antara jenis nilai dan jenis referensi.
Menggunakan awalan constrained juga menghindari potensi masalah penerapan versi dengan jenis nilai. Jika awalan constrained tidak digunakan, IL yang berbeda harus dipancarkan tergantung pada apakah jenis nilai mengambil alih metode System.Object atau tidak. Misalnya, jika jenis nilai V mengambil alih metode Object.ToString(), instruksi callV.ToString() dipancarkan; jika tidak, instruksi box dan instruksi callvirtObject.ToString() dikeluarkan. Masalah penerapan versi dapat muncul dalam kasus sebelumnya jika penimpaan kemudian dihapus, dan dalam kasus terakhir jika penimpaan kemudian ditambahkan.
Awalan constrained juga dapat digunakan untuk pemanggilan metode antarmuka pada jenis nilai, karena metode jenis nilai yang mengimplementasikan metode antarmuka dapat diubah menggunakan MethodImpl. Jika awalan constrained tidak digunakan, pengkompilasi dipaksa untuk memilih metode jenis nilai mana yang akan diikat pada waktu kompilasi. Menggunakan awalan constrained memungkinkan MSIL untuk mengikat ke metode yang mengimplementasikan metode antarmuka pada waktu proses, bukan pada waktu kompilasi.
Kelebihan metode Emit berikut dapat menggunakan opcode constrained: