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 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:
Pointer terkelola,
ptr
, didorong ke tumpukan. Jenisptr
harus berupa penunjuk terkelola (&
) hinggathisType
. Perhatikan bahwa ini berbeda dari kasus instruksi yang belum diprefikscallvirt
, yang mengharapkan referensi darithisType
.Argumen metode
arg1
melaluiargN
didorong ke tumpukan, sama seperti instruksi yang tidak diprefikscallvirt
.
constrained
Awalan dirancang untuk memungkinkan callvirt
instruksi dibuat dengan cara yang seragam terlepas dari apakah thisType
itu jenis nilai atau jenis referensi.
callvirt
method
Ketika instruksi telah diawali oleh constrained
thisType
, instruksi dijalankan sebagai berikut:
Jika
thisType
adalah jenis referensi (dibandingkan dengan jenis nilai) makaptr
didereferensikan dan diteruskan sebagai penunjuk 'ini' kecallvirt
darimethod
.Jika
thisType
adalah jenis nilai danthisType
mengimplementasikanmethod
makaptr
diteruskan tanpa dimodifikasi sebagai penunjuk 'ini' kecall
method
instruksi, untuk implementasimethod
olehthisType
.Jika
thisType
adalah jenis nilai danthisType
tidak diterapkanmethod
makaptr
didereferensikan, dikotak, dan diteruskan sebagai penunjuk 'ini' kecallvirt
method
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 call
V.ToString()
Object.ToString(), instruksi dikeluarkan; jika tidak, box
instruksi dan callvirt
Object.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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk