Dari ECMA 335 , bagian 8.10.4 dari partisi 1:
CTS menyediakan kontrol independen atas nama yang terlihat dari tipe dasar (bersembunyi) dan berbagi slot tata letak di kelas turunan (menimpa). Menyembunyikan dikontrol dengan menandai anggota di kelas turunan sebagai sembunyikan dengan nama atau sembunyikan dengan nama-dan-tanda tangan. Penyembunyian selalu dilakukan berdasarkan jenis anggota, yaitu, nama bidang turunan bisa menyembunyikan nama bidang dasar, tetapi tidak nama metode, nama properti, atau nama acara. Jika anggota turunan ditandai sembunyikan dengan nama, maka anggota sejenis di kelas dasar dengan nama yang sama tidak terlihat di kelas turunan; jika anggota ditandai sembunyikan dengan nama-dan-tanda tangan maka hanya anggota yang sama dengan nama dan jenis yang sama persis (untuk bidang) atau tanda tangan metode (untuk metode) disembunyikan dari kelas turunan. Implementasi perbedaan antara dua bentuk persembunyian ini sepenuhnya disediakan oleh penyusun bahasa sumber dan perpustakaan refleksi; itu tidak berdampak langsung pada VES itu sendiri.
(Tidak jelas dari itu, tetapi hidebysig
berarti "sembunyikan dengan nama-dan-tanda tangan".)
Juga di bagian 15.4.2.2 dari partisi 2:
hidebysig disediakan untuk penggunaan alat dan diabaikan oleh VES. Ini menentukan bahwa metode yang dideklarasikan menyembunyikan semua metode dari tipe kelas dasar yang memiliki tanda tangan metode yang cocok; jika dihilangkan, metode tersebut harus menyembunyikan semua metode dengan nama yang sama, terlepas dari tanda tangannya.
Sebagai contoh, misalkan Anda memiliki:
public class Base
{
public void Bar()
{
}
}
public class Derived : Base
{
public void Bar(string x)
{
}
}
...
Derived d = new Derived();
d.Bar();
Itu valid, karena Bar(string)
tidak disembunyikan Bar()
, karena kompilator C # menggunakan hidebysig
. Jika menggunakan semantik "sembunyikan menurut nama", Anda tidak akan dapat memanggil Bar()
sama sekali pada referensi jenis Derived
, meskipun Anda masih bisa mentransmisikannya ke Basis dan menyebutnya seperti itu.
EDIT: Saya baru saja mencoba ini dengan mengompilasi kode di atas ke DLL, meng-ildasming, menghapus hidebysig
for Bar()
dan Bar(string)
, ilasming lagi, lalu mencoba memanggil Bar()
dari kode lain:
Derived d = new Derived();
d.Bar();
Test.cs(6,9): error CS1501: No overload for method 'Bar' takes '0' arguments
Namun:
Base d = new Derived();
d.Bar();
(Tidak ada masalah kompilasi.)
Shadows
danOverloads
di VB.NET.