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
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?
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ürO
) 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.
't neden C# Statik Yöntemler bir ...
Neden Java bize bir isim dosya adından...
Neden Python 3&; 00" harf için 0 ...
Neden bu istisnalar atmak için değil m...
Neden bana C bir sabit, sabit bir char...