SORU
28 ŞUBAT 2015, CUMARTESİ


Neden yok C# derleyicisi bu tercüme=! eğer a > sanki karşılaştırılması; karşılaştırma?

Tamamen şans eseri C keşfettim# derleyicisi bu yöntem açar:

static bool IsNotNull(object obj)
{
    return obj != null;
}

...bu işe CIL:

.method private hidebysig static bool IsNotNull(object obj) cil managed
{
    ldarg.0   // obj
    ldnull
    cgt.un
    ret
}

...ya da, eğer varsa decompiled C bakmak isterseniz# kod:

static bool IsNotNull(object obj)
{
    return obj > null;   // (note: this is not a valid C# expression)
}

Nasıl != olarak çevrilmiş olur gel ">"?

CEVAP
28 ŞUBAT 2015, CUMARTESİ


Kısa cevap:

"Eşit karşılaştırmak" IL anlatım, C# != operatör tam yazışmalar vardı ve kelimenin tam anlamıyla tercüme edilmiştir. o yüzden hiç yok

Orada ancak bir "mukayese-eşit" Yönerge (ceq, doğrudan yazışma == operatör), genel durum, x != y alır çevrilmiş gibi onun biraz daha uzun eşdeğer (x == y) == false.

Varayrıcabir "karşılaştırma büyük-daha" talimat IL (cgt) sağlayan derleyici için bazı kısayollar (yani üretmek daha kısa rı), bir varlık eşitsizlik karşılaştırmalar maddelere karşı boş obj != null, tercüme gibi "obj > null".


Hadi biraz daha detaya.

Eğer "eşit karşılaştırmak" IL talimat, nasıl aşağıdaki yöntem derleyici tarafından tercüme alacak? eğer yok

static bool IsNotEqual(int x, int y)
{
    return x != y;
}

Zaten, derleyici (x == y) == false içine x != y dönecek yukarıda " dedi

.method private hidebysig static bool IsNotEqual(int32 x, int32 y) cil managed 
{
    ldarg.0   // x
    ldarg.1   // y
    ceq
    ldc.i4.0  // false
    ceq       // (note: two comparisons in total)
    ret
}

Derleyici her zaman uzun soluklu bu oldukça desen üretmez çıkıyor. Biz sürekli 0 ile y yerine ne olur: görelim

static bool IsNotZero(int x)
{
    return x != 0;
}

IL üretilen genel durumda daha kısadır

.method private hidebysig static bool IsNotZero(int32 x) cil managed 
{
    ldarg.0    // x
    ldc.i4.0   // 0
    cgt.un     // (note: just one comparison)
    ret
}

Derleyici olabilir yararlanmak aslında bu imzalı tamsayı saklanır two's complement (burada, eğer elde edilen bit desen yorumlanır işaretsiz tamsayı-o ne .un araçlar-0 en küçük Olası değeri) çevirir x == 0 olarak unchecked((uint)x) > 0.

Derleyici null karşı eşitsizlik çekler için aynı şeyi yapabilirsiniz çıkıyor:

static bool IsNotNull(object obj)
{
    return obj != null;
}

Derleyici neredeyse IsNotZero aynı IL üretir:

.method private hidebysig static bool IsNotNull(object obj) cil managed 
{
    ldarg.0
    ldnull   // (note: this is the only difference)
    cgt.un
    ret
}

Görünüşe göre, derleyici null referans bit deseni en küçük bit deseni herhangi bir nesne başvurusu için olası olduğunu ifade etmek için izin verilir.

Bu kısayol açıkça Common Language Infrastructure Annotated Standard (1st edition from Oct 2003) belirtilen (Tablo Dipnot olarak sayfa 491, 6-4, "İkili Karşılaştırmalar veya Şube İşlemleri"):

"cgt.un ObjectRefs (O) izin ve doğrulanabilir. Bu boş bir ObjectRef ("- - eşit karşılaştırın aksi takdirde daha belirgin bir çözüm olurdu" talimatı)." yok karşılaştırırken yaygın olarak kullanılır

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • justintimberlakeVEVO

    justintimber

    2 EYLÜL 2009
  • Rootjunky.com

    Rootjunky.co

    22 EKİM 2011