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

  • DigitalRev TV

    DigitalRev T

    30 AĞUSTOS 2007
  • KRQE

    KRQE

    6 AĞUSTOS 2007
  • Paulo Bautista

    Paulo Bautis

    21 Aralık 2008