OpCodes.Callvirt 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.
Memanggil metode yang terlambat terikat pada objek, mendorong nilai pengembalian ke tumpukan evaluasi.
public: static initonly System::Reflection::Emit::OpCode Callvirt;
public static readonly System.Reflection.Emit.OpCode Callvirt;
staticval mutable Callvirt : System.Reflection.Emit.OpCode
Public Shared ReadOnly Callvirt As OpCode
Nilai Bidang
Keterangan
Tabel berikut mencantumkan format rakitan heksadesimal instruksi dan Microsoft Intermediate Language (MSIL), bersama dengan ringkasan referensi singkat:
Format | Format Rakitan | Deskripsi |
---|---|---|
6F <T > |
callvirt method |
Memanggil metode tertentu yang terkait dengan obj . |
Perilaku transisi tumpukan, dalam urutan berurutan, adalah:
Referensi
obj
objek didorong ke tumpukan.Argumen metode
arg1
melaluiargN
didorong ke tumpukan.Argumen metode
arg1
melalui dan referensiobj
objek muncul dari tumpukan; panggilan metode dilakukan dengan argumen dan kontrol ini ditransfer ke metode yangobj
disebutkan oleh token metadataargN
metode. Setelah selesai, nilai pengembalian dihasilkan oleh metode penerima panggilan dan dikirim ke pemanggil.Nilai yang dikembalikan didorong ke tumpukan.
callvirt
Instruksi memanggil metode yang terlambat terikat pada objek. Artinya, metode dipilih berdasarkan jenis obj
runtime daripada kelas waktu kompilasi yang terlihat dalam penunjuk metode.
Callvirt
dapat digunakan untuk memanggil metode virtual dan instans. Instruksi callvirt
dapat segera didahului oleh tail
awalan (Tailcall) untuk menentukan bahwa bingkai tumpukan saat ini harus dirilis sebelum mentransfer kontrol. Jika panggilan akan mentransfer kontrol ke metode kepercayaan yang lebih tinggi daripada metode asli, bingkai tumpukan tidak akan dirilis.
Token metadata metode menyediakan nama, kelas, dan tanda tangan metode yang akan dipanggil. Kelas yang terkait dengan obj
adalah kelas yang merupakan instans. Jika kelas menentukan metode non-statis yang cocok dengan nama metode dan tanda tangan yang ditunjukkan, metode ini dipanggil. Jika tidak, semua kelas dalam rantai kelas dasar kelas ini diperiksa secara berurutan. Ini adalah kesalahan jika tidak ada metode yang ditemukan.
Callvirt
memunculkan objek dan argumen terkait dari tumpukan evaluasi sebelum memanggil metode . Jika metode memiliki nilai pengembalian, metode didorong pada tumpukan setelah penyelesaian metode. Di sisi penerima panggilan, obj
parameter diakses sebagai argumen 0, arg1
sebagai argumen 1, dan sebagainya.
Argumen ditempatkan pada tumpukan dalam urutan kiri-ke-kanan. Artinya, argumen pertama dihitung dan ditempatkan pada tumpukan, lalu argumen kedua, kemudian argumen ketiga, sampai semua argumen yang diperlukan berada di atas tumpukan dalam urutan menur. Referensi obj
instans (selalu diperlukan untuk callvirt
) harus didorong sebelum argumen yang terlihat pengguna. Tanda tangan (dibawa dalam token metadata) tidak perlu berisi entri dalam daftar parameter untuk penunjuk ini.
Perhatikan bahwa metode virtual juga dapat dipanggil menggunakan Call instruksi.
MissingMethodException dilemparkan jika metode non-statis dengan nama dan tanda tangan yang ditunjukkan tidak dapat ditemukan di kelas yang terkait dengan obj
atau salah satu kelas dasarnya. Ini biasanya terdeteksi ketika instruksi Microsoft Intermediate Language (MSIL) dikonversi ke kode asli, bukan pada runtime.
NullReferenceException dilemparkan jika obj null.
SecurityException dilemparkan jika keamanan sistem tidak memberikan akses pemanggil ke metode yang disebut. Pemeriksaan keamanan dapat terjadi ketika CIL dikonversi ke kode asli daripada pada durasi.
Catatan
Saat memanggil metode System.Object pada jenis nilai, pertimbangkan untuk constrained
menggunakan awalan dengan callvirt
instruksi. Ini menghapus kebutuhan untuk memancarkan IL yang berbeda tergantung pada apakah jenis nilai mengambil alih metode atau tidak, menghindari potensi masalah penerapan versi. Pertimbangkan untuk constrained
menggunakan awalan saat memanggil metode antarmuka pada jenis nilai, karena metode jenis nilai yang mengimplementasikan metode antarmuka dapat diubah menggunakan MethodImpl
. Masalah ini dijelaskan secara lebih rinci dalam Constrained opcode.
Metode berikut Emit kelebihan beban dapat menggunakan callvirt
opcode: