SORU
9 ŞUBAT 2012, PERŞEMBE


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
9 ŞUBAT 2012, PERŞEMBE


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/

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AverageBroTV

    AverageBroTV

    20 Mart 2013
  • EatingIn

    EatingIn

    12 EKİM 2013
  • wowchick16

    wowchick16

    17 Mart 2007