Share via


OpCodes.Callvirt Bidang

Definisi

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:

  1. Referensi obj objek didorong ke tumpukan.

  2. Argumen metode arg1 melalui argN didorong ke tumpukan.

  3. Argumen metode arg1 melalui dan referensi obj objek muncul dari tumpukan; panggilan metode dilakukan dengan argumen dan kontrol ini ditransfer ke metode yang obj disebutkan oleh token metadata argN metode. Setelah selesai, nilai pengembalian dihasilkan oleh metode penerima panggilan dan dikirim ke pemanggil.

  4. 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:

Berlaku untuk