SORU
3 ŞUBAT 2010, ÇARŞAMBA


Neden yok C# 'boş atmak için izin'?

Özellikle karmaşık bazı özel durum işleme kodu yazılırken, birisi sordu, özel nesne null değil mi emin olmanız gerekir değil mi? Ve, tabii ki dedim, ama sonra denemeye karar verdi. Görünüşe göre, boş atabilir, ama yine de bir istisna içine bir yere döndü.

Neden bu izin veriliyor?

throw null;

Bu parçacık, neyse ki 'eski' boş değil, ama hiç olacak?!"

try
{
  throw null;
}
catch (Exception ex)
{
  //can ex ever be null?

  //thankfully, it isn't null, but is
  //ex is System.NullReferenceException
}

CEVAP
3 ŞUBAT 2010, ÇARŞAMBA


Dil belirtimi türü System.Exception ** * * (Bu nedenle, * 6 * Bu bağlamda geçerli olan bir ifade bekliyor ve boş olmayan bu ifade kısıtlamak değil çünkü. Genel olarak, bu ifadenin değeri null olup olmadığını tespit edebilir bir yolu yok. Durdurma sorunu çözmek için. Çalışma zamanı null dava ile yine uğraşmak zorunda kalacaktır. Bkz:

Exception ex = null;
if (conditionThatDependsOnSomeInput) 
    ex = new Exception();
throw ex; 

Elbette null edebi geçersiz atma belli etmez ama o kadar şartname alan atık ve küçük çıkarları için tutarlılık azaltmak neden çok yardımcı, değil mi?

Yasal Uyarı Eric Lippert tarafından seriliyorum önce): Bubenim kendibu tasarım kararın arkasındaki mantık hakkında spekülasyon. Tabii ki, tasarım toplantısı) gitmedim


Cevap için ikinci soru, ister bir ifade, değişken yakaladı içinde bir catch tümcesi olabilir hiç boş İken: C# özellikleri konusunda sessiz olsun diğer diller neden olabilir null özel durum için yayılma, define yolu istisnalar yayılır:

Varsa catch yan tümceleri, görünüm sırasına durum için uygun bir işleyici bulmak için incelenir. İlk catch tümcesibu özel durum türü veya özel durum türü temel türünü belirtirbir eşleşme olarak kabul edilir. Genel bir catch tümcesi herhangi bir özel durum türü için bir eşleşme olarak kabul edilir. [...]

null kalın deyimi yanlış. - Sadece neye dayanarak C# spec diyor, biz söyleyemeyeceğim temel çalışma zamanı olmayacak hiç atmak null, biz emin olsa bile, böyle oldu, olacak sadece idare tarafından genel catch {} fıkra.

SİSTEMİNDE üzerinde C# uygulamaları, ECMA 335 belirtimi bakabilirsiniz. Bu belge CLİ içten atar tüm özel durumları yok null () tanımlar ve kullanıcı tanımlı özel eşyaları throw Yönerge tarafından atılan bahseder. Bu talimat açıklaması C# throw açıklama System.Exception nesne türü kısıtlama getirmiyor hariç) hemen hemen aynı

Açıklama:

throw talimat üzerine özel durum nesnesi (tür O) yığına atar ve yığın boşaltır. Özel durum ayrıntıları için mekanizma, Bölüm I. bkz
SİSTEMİNDE atılan herhangi bir nesne verir, CLS belirli bir özel durum sınıfı açıklar dil birlikte çalışabilirlik için kullanılacak. [not: not end]

Özel durumlar:

System.NullReferenceException obj null ise atılır.

Doğruluğu:

Doğru CIL nesne her zaman ya null veya bir nesne başvurusu (24 ** tip yani) sağlar.

Bu özel durumlar asla null yakaladı sonuçlandırmak için yeterli olduğuna inanıyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • Elefant Traks

    Elefant Trak

    5 HAZİRAN 2007
  • The Brister

    The Brister

    10 ŞUBAT 2008