(Visual Studio 2017'deki yeni istisna yardımcısı hakkında bilgi için bu cevabın sonuna bakın)
Bu kodu düşünün:
String s = null;
Console.WriteLine(s.Length);
Bu NullReferenceExceptionikinci satıra bir atar ve .NET'in neden sistisna atıldığında boş olduğunu söylemediğini bilmek istersiniz .
Bu bilgiyi neden almadığınızı anlamak için, çalıştıranın C # kaynağı değil, IL olduğunu hatırlamanız gerekir:
IL_0001: ldnull
IL_0002: stloc.0 // s
IL_0003: ldloc.0 // s
IL_0004: callvirt System.String.get_Length
IL_0009: System.Console.WriteLine'ı çağırın
Bu ise callvirtatar işlem kodu NullReferenceExceptionve yapar değerlendirme yığın ilk bağımsız boş bir referans (kullanılarak yüklenmiştir bir olduğunda ldloc.0).
Eğer .NET bunun sboş bir referans olduğunu söyleyebiliyorsa , bir şekilde değerlendirme yığınındaki ilk argümanın form kaynaklı olduğunu izlemelidir s. Bu durumda, sbunun boş olduğunu görmek bizim için kolaydır, ancak ya değer başka bir işlev çağrısından bir dönüş değeriyse ve herhangi bir değişkende depolanmamışsa? Her neyse, bu tür bilgiler, .NET sanal makinesi gibi bir sanal makinede takip etmek isteyeceğiniz şeyler değildir.
Bu sorunu önlemek için, tüm genel yöntem çağrılarında argüman null denetimi yapmanızı öneririm (tabii ki boş referansa izin vermezseniz):
public void Foo(String s) {
if (s == null)
throw new ArgumentNullException("s");
Console.WriteLine(s.Length);
}
Yönteme null geçirilirse, sorunun ne olduğunu tam olarak açıklayan bir istisna elde edersiniz (bu s, boştur).
Dört yıl sonra Visual Studio 2017, artık bir NullReferenceExceptionatıldığında neyin null olduğunu söylemeye çalışan yeni bir istisna yardımcısına sahip . Hatta boş olan bir yöntemin dönüş değeri olduğunda size gerekli bilgileri verebilir:

Bunun yalnızca bir DEBUG yapısında çalıştığını unutmayın.