Kısa cevap:
IL'de "eşit olmayan karşılaştırma" talimatı yoktur, bu nedenle C # !=
operatörünün tam bir karşılığı yoktur ve harfi harfine tercüme edilemez.
Bununla birlikte, "karşılaştırmalı" bir talimat vardır ( ceq
, ==
operatöre doğrudan bir karşılık gelir ), bu nedenle genel durumda, x != y
biraz daha uzun olan eşdeğeri gibi çevrilir (x == y) == false
.
Orada da bir "karşılaştırma-büyüktür" IL (öğretim cgt
) derleyici boş karşı nesnelerin o eşitsizlik karşılaştırmaları olmak (yani daha kısa IL kodu oluşturmak) birini belli kısayollar almasına izin veriyor, obj != null
onlar sanki, "tercüme olsun obj > null
".
Biraz daha ayrıntıya girelim.
IL'de "eşit olmayan karşılaştırma" talimatı yoksa, aşağıdaki yöntem derleyici tarafından nasıl çevrilecek?
static bool IsNotEqual(int x, int y)
{
return x != y;
}
Yukarıda da belirtildiği gibi, derleyici şuna x != y
dönüşecektir (x == y) == false
:
.method private hidebysig static bool IsNotEqual(int32 x, int32 y) cil managed
{
ldarg.0
ldarg.1
ceq
ldc.i4.0
ceq
ret
}
Derleyicinin her zaman bu oldukça uzun soluklu modeli üretmediği ortaya çıktı. y
0 sabitiyle değiştirdiğimizde ne olacağını görelim :
static bool IsNotZero(int x)
{
return x != 0;
}
Üretilen IL, genel durumdakinden biraz daha kısadır:
.method private hidebysig static bool IsNotZero(int32 x) cil managed
{
ldarg.0
ldc.i4.0
cgt.un
ret
}
Derleyici imzalı tamsayı saklanır gerçeği yararlanabilir iki tamlayıcısı (- yani en neyi elde edilen bit desenleri işaretsiz tamsayı olarak yorumlanır eğer nerede, .un
araç - 0 Mümkün olan en küçük değere sahip), bu çevirir böylece x == 0
o sanki unchecked((uint)x) > 0
.
Derleyicinin aşağıdakilere karşı eşitsizlik kontrolleri için aynısını yapabileceği ortaya çıktı null
:
static bool IsNotNull(object obj)
{
return obj != null;
}
Derleyici, aşağıdakilerle neredeyse aynı IL'yi üretir IsNotZero
:
.method private hidebysig static bool IsNotNull(object obj) cil managed
{
ldarg.0
ldnull
cgt.un
ret
}
Görünüşe göre, derleyicinin null
referansın bit modelinin herhangi bir nesne referansı için mümkün olan en küçük bit modeli olduğunu varsaymasına izin verilmektedir .
Bu kısayol, Ortak Dil Altyapısı Açıklamalı Standartta (Ekim 2003'ten itibaren 1. baskı) (sayfa 491, Tablo 6-4, "İkili Karşılaştırmalar veya Dal İşlemleri" dipnotu olarak ) açıkça belirtilmiştir :
" cgt.un
ObjectRefs (O) üzerinde izin verilir ve doğrulanabilir. Bu, genellikle bir ObjectRef'i null ile karşılaştırırken kullanılır (aksi takdirde daha açık bir çözüm olacak" eşit olmayan karşılaştırma "talimatı yoktur)."
int
'nin aralığında aynı gösterimiint
onlar olduğu gibiuint
. Bu ikinin tamamlayıcısından çok daha zayıf bir gereksinimdir.