Bir MSIL yönteminde hidebysig'in amacı nedir?


92

İldasm ve bir C # programı kullanma örn.

static void Main(string[] args)
{

}

verir:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       2 (0x2)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ret
} // end of method Program::Main

Hidebysig yapısı ne işe yarar?

Yanıtlar:


156

Gönderen ECMA 335 , bölüm 1 bölüm 8.10.4:

CTS, hem temel türden görülebilen adlar (gizleme) hem de türetilmiş sınıftaki yerleşim alanlarının paylaşımı (geçersiz kılma) üzerinde bağımsız denetim sağlar. Gizleme, türetilmiş sınıftaki bir üyeyi ada göre gizle veya ad ve imzaya göre gizle olarak işaretleyerek kontrol edilir. Gizleme her zaman üye türüne göre yapılır, yani türetilmiş alan adları temel alan adlarını gizleyebilir, ancak yöntem adlarını, özellik adlarını veya olay adlarını gizleyemez. Türetilmiş bir üye isme göre gizle olarak işaretlenirse, temel sınıftaki aynı türden aynı ada sahip üyeler türetilmiş sınıfta görünmez; üye ad ve imzayla gizle olarak işaretlenmişse, yalnızca aynı türden bir üye tam olarak aynı ada ve türe (alanlar için) veya yöntem imzasına (yöntemler için) sahip türetilmiş sınıftan gizlenir. Bu iki gizleme biçimi arasındaki ayrımın uygulanması tamamen kaynak dil derleyicileri ve yansıma kütüphanesi tarafından sağlanır; VES'in kendisi üzerinde doğrudan bir etkisi yoktur.

(Bundan hemen anlaşılmıyor, ancak hidebysig"ad ve imzayla gizle" anlamına geliyor.)

Ayrıca bölüm 2'nin 15.4.2.2 bölümünde:

hidebysig, araçların kullanımı için sağlanır ve VES tarafından dikkate alınmaz. Belirtilen yöntemin, eşleşen bir yöntem imzası olan temel sınıf türlerinin tüm yöntemlerini gizlediğini belirtir; atlandığında, yöntem imzadan bağımsız olarak aynı addaki tüm yöntemleri gizlemelidir.

Örnek olarak, sahip olduğunuzu varsayalım:

public class Base
{
    public void Bar()
    {
    }
}

public class Derived : Base
{
    public void Bar(string x)
    {
    }
}

...

Derived d = new Derived();
d.Bar();

Çünkü, geçerli olduğundan Bar(string) değil gizlemek Bar()çünkü C # derleyicisi kullanımları hidebysig. Eğer "isme göre sakla" semantiğini kullansaydı, Bar()bir tür referansını arayamazsınız Derived, ancak yine de onu Base'e çevirebilir ve bu şekilde adlandırabilirsiniz.

DÜZENLEME: Ben sadece bunu ildasming, bir DLL için yukarıdaki kod derleme kaldırarak bu denedim hidebysigiçin Bar()ve Bar(string)sonra da aramaya çalışıyorum, tekrar ilasming, Bar()diğer koddan:

Derived d = new Derived();
d.Bar();

Test.cs(6,9): error CS1501: No overload for method 'Bar' takes '0' arguments

Ancak:

Base d = new Derived();
d.Bar();

(Derleme sorunu yok.)


4
In Özetle , bu arasındaki fark Shadowsve OverloadsVB.NET içinde.
Mark Hurd

15

THE SKEET'in cevabına göre, bunun nedeni Java ve C # 'nin bir sınıfın istemcisinin temel sınıflardan olanlar da dahil olmak üzere aynı ada sahip herhangi bir yöntemi çağırmasına izin vermesidir. C ++ ise: türetilmiş sınıf, temel sınıftaki bir yöntemle aynı ada sahip tek bir yöntemi bile tanımlıyorsa, istemci aynı bağımsız değişkenleri almasa bile temel sınıf yöntemini doğrudan çağıramaz. Bu nedenle özellik, aşırı yüklemeye yönelik her iki yaklaşımı desteklemek için CIL'e dahil edildi.

C ++ 'da, bir usingyönergeyle temel sınıftan adlandırılmış bir aşırı yükleme kümesini etkin bir şekilde içe aktarabilirsiniz , böylece bunlar, bu yöntem adı için "aşırı yük kümesinin" bir parçası haline gelir.


1

Microsoft Docs'a göre

Türetilmiş bir sınıftaki bir üye C # newdeğiştiricisi veya Visual Basic Shadowsdeğiştiricisi ile bildirildiğinde, temel sınıfta aynı ada sahip bir üyeyi gizleyebilir. C #, temel sınıf üyelerini imza ile gizler. Diğer bir deyişle, temel sınıf üyesi birden çok aşırı yüklemeye sahipse, gizli olan yalnızca aynı imzaya sahip olandır. Buna karşılık, Visual Basic tüm temel sınıf aşırı yüklemelerini gizler. Böylece, IsHideBySigfalse , Visual Basic Shadows değiştiricisiyle truebildirilen bir üye ve C # newdeğiştiriciyle bildirilen bir üye üzerinde döndürür .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.