Bagikan melalui


OpCodes.Constrained Bidang

Definisi

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 mencantumkan format rakitan heksadesimal dan bahasa perantara Microsoft (MSIL) instruksi, bersama dengan ringkasan referensi singkat:

Format Format Rakitan Deskripsi
FE 16 <T> Dibatasi. thisType Panggil metode virtual pada jenis yang dibatasi untuk menjadi jenis T.

constrained Awalan hanya diizinkan pada callvirt instruksi.

Status tumpukan MSIL pada titik ini harus sebagai berikut:

  1. Pointer terkelola, ptr, didorong ke tumpukan. Jenis ptr harus berupa penunjuk terkelola (&) hingga thisType. Perhatikan bahwa ini berbeda dari kasus instruksi yang belum diprefiks callvirt , yang mengharapkan referensi dari thisType.

  2. Argumen metode arg1 melalui argN didorong ke tumpukan, sama seperti instruksi yang tidak diprefiks callvirt .

constrained Awalan dirancang untuk memungkinkan callvirt instruksi dibuat dengan cara yang seragam terlepas dari apakah thisType itu jenis nilai atau jenis referensi.

callvirtmethod Ketika instruksi telah diawali oleh constrainedthisType, instruksi dijalankan sebagai berikut:

  • Jika thisType adalah jenis referensi (dibandingkan dengan jenis nilai) maka ptr didereferensikan dan diteruskan sebagai penunjuk 'ini' ke callvirt dari method.

  • Jika thisType adalah jenis nilai dan thisType mengimplementasikan method maka ptr diteruskan tanpa dimodifikasi sebagai penunjuk 'ini' ke callmethod instruksi, untuk implementasi method oleh thisType.

  • Jika thisType adalah jenis nilai dan thisType tidak diterapkan method maka ptr didereferensikan, dikotak, dan diteruskan sebagai penunjuk 'ini' ke callvirtmethod instruksi.

Kasus terakhir ini hanya dapat terjadi ketika method didefinisikan pada Object, , ValueTypeatau Enum dan tidak ditimpa oleh thisType. Dalam hal ini, tinju menyebabkan salinan objek asli dibuat. Namun, karena tidak ada metode Object, , ValueTypedan Enum memodifikasi status objek, fakta ini tidak dapat dideteksi.

constrained Awalan mendukung generator IL yang membuat kode generik. callvirt Biasanya instruksi 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.

constrained Opcode memungkinkan pengkompilasi IL untuk melakukan panggilan ke fungsi virtual dengan cara yang seragam independen dari apakah ptr itu jenis nilai atau jenis referensi. Meskipun ditujukan untuk kasus di mana thisType adalah variabel jenis generik, constrained awalan 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 V nilai mengambil alih metode callV.ToString() Object.ToString(), instruksi dikeluarkan; jika tidak, box instruksi dan callvirtObject.ToString() instruksi akan dipancarkan. Masalah penerapan versi dapat muncul dalam kasus sebelumnya jika penimpaan kemudian dihapus, dan dalam kasus terakhir jika penimpaan kemudian ditambahkan.

constrained Awalan 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 durasi, bukan pada waktu kompilasi.

Metode berikut Emit kelebihan beban dapat menggunakan constrained opcode:

Berlaku untuk