SORU
17 Mart 2009, Salı


MSIL yöntemi hidebysig amacı nedir?

Ildasm kullanarak bir C# programı örneğin

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

Bu hidebysig inşa ne yapar?

CEVAP
17 Mart 2009, Salı


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

CTS bağımsız kontrol sağlar görünen iki isim üzerinde taban türü (gizleme) ve türetilmiş bir düzen yuvaları paylaşımı sınıf () geçersiz kılma. Saklanıyor kontrollü bir üye işaretleyerek türetilmiş sınıf olarak ya da ada göre gizle ya da adı-ve-imza ile gizleyin. Gizleme hep Türüne göre yapılır üye, yani türetilmiş alan adlarını baz alan adları, ama saklanamaz değil, yöntem adları, özellik adları, ya da olay isim. Eğer türetilmiş bir üyesi ise adını gizlemek üyeleri daha sonra işaretli temel sınıf ile aynı tür aynı adı görülmez Eğer Üye işaretlenmişse türetilmiş sınıf; adı-andsignature sonra sadece gizle tam olarak aynı tür üyesi adı ve türü (alanlar için) ya da aynı imza yöntemi (yöntemleri) türetilmiş sınıf gizli. Ayrım uygulanması gizleme bu iki biçimi arasındaki tamamen sağlanan kaynak dil ile Compiler ve yansıma kitaplığı; VES üzerinde doğrudan bir etkisi vardır kendisi.

(Hemen hiç de açık değil, ama hidebysig "anlamına gelir adı-ve-imza ile gizlemek".)

Bölüm 2 Bölüm 15.4.2.2 da

hidebysig kullanımı için temin edilir araçlar ve VES tarafından göz ardı edilir. Bu ilan yöntemi belirtir gizler taban sınıfının tüm yöntemleri eşleşen bir yöntem olan türleri atlandığında imza; yöntemi aynı tüm yöntemleri gizlememeli adı ne olursa olsun bir imza.

Örnek olarak, varsayalım:

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

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

...

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

Bar(string) için geçerliyokC çünkü Bar() gizle# derleyicisi hidebysig kullanır. Eğer kullanılan "gizle tarafından adı" anlambilim, olmaz edebilmek çağrı Bar() Hiç bir referans türü Derived, buna rağmen, hala kadro için Taban ve ara öyle.

EDİT: ben daha önce denedim bu derleme yukarıdaki kod bir DLL, ildasming, çıkarma hidebysig Bar() Bar(string), ilasming tekrar, sonra aramaya Bar() diğer kod:

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 sorunları.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
Cil

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dopelives

    Dopelives

    30 Temmuz 2009
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007
  • midomansour

    midomansour

    19 EYLÜL 2009