Neden kısa null null değerleri ile karşılaştırmak için int null değerlere dönüştürülür?
Null kısa değerlerini karşılaştırmak, derleyici önce onları bir null ile karşılaştırma yapmak için bir tamsayı için dönüştürür. Örneğin, bu basit kodu göz önünde bulundurun:
short? cTestA;
if (cTestA == null) { ... }
Derleyici tarafından dönüştürülür:
short? CS$0$0001 = cTestA;
int? CS$0$0002 = CS$0$0001.HasValue ? new int?(CS$0$0001.GetValueOrDefault()) : null;
if (!CS$0$0002.HasValue){ ... }
Bu herkes için olur .NET sürümleri de dahil olmak üzere .NET 4.
Burada neyi kaçırıyorum? Sadece HasValue bir kontrol için bu çift çevrim sebebi nedir?
Takip
Derleyici yapmanı bekliyorum ne basit bir kontrol yapmak için .HasValue, if (cTestA.HasValue){}
. En azından bu dönüşüm keşfetmek sonra Şifremi ne olduğunu.
Neden tüm bu ekstra kod böyle basit bir test için eklenir?
CEVAP
Ynt: Son güncelleme:
Bu null aritmetik iyileştirici bir hata değildir.
Null doktoru gibi bir şey yaptığınız zaman int?
gereksiz dönüşüm kaldırır:
short? s = null;
int? x = s 1;
Unoptimized, codegen denk geliyor:
short? s = null;
int? x;
int? temp = s.HasValue ? new int?((int)s.Value) : new int?();
x = temp.HasValue ? new int?(x.Value 1) : new int?();
Optimize edilmiş codegen denk geliyor:
short? s = null;
int? x;
x = s.HasValue ? new int?((int)s.Value 1) : new int?();
Ancak, iyileştirici bir hata içeriyor; eşitlik için gereksiz dönüşüm kaldırmıyoruz.
Dikkatimi çektiğiniz için teşekkür ederim; Roslyn hallederiz. Aslında önümüzdeki birkaç hafta içinde Roslyn için null iyileştirici yazmak üzereyim.
GÜNCELLEME: o doktoru ben yazdım, ve eğer nasıl çalıştığını ilgilenen varsa, burada başlar: üzerine bir dizi makale yazdım
http://ericlippert.com/2012/12/20/nullable-micro-optimizations-part-one/
Kısa devre operatörleri null Boolean d...
Null değerleri kontrol etmek için doğr...
Neden adresi null işaretçi için kullan...
Neden >= yanlış zaman == null değer...
Neden nesne türü dinamik bir null başv...