(Untuk informasi tentang pembantu pengecualian baru di Visual Studio 2017 lihat akhir jawaban ini)
Pertimbangkan kode ini:
String s = null;
Console.WriteLine(s.Length);
Ini akan membuang NullReferenceExceptiondi baris kedua dan Anda ingin tahu mengapa .NET tidak memberi tahu Anda bahwa itu sadalah nol ketika pengecualian dilemparkan.
Untuk memahami mengapa Anda tidak mendapatkan informasi itu, Anda harus ingat bahwa itu bukan C # source yang mengeksekusi melainkan IL:
IL_0001: ldnull
IL_0002: stloc.0 // s
IL_0003: ldloc.0 // s
IL_0004: callvirt System.String.get_Length
IL_0009: panggil System.Console.WriteLine
Ini adalah callvirtopcode yang melempar NullReferenceExceptiondan melakukan itu ketika argumen pertama pada tumpukan evaluasi adalah referensi nol (yang dimuat menggunakan ldloc.0).
Jika .NET harus dapat mengetahui bahwa itu adalah sreferensi null, itu harus dalam beberapa cara melacak bahwa argumen pertama pada tumpukan evaluasi berasal dari formulir s. Dalam hal ini mudah bagi kita untuk melihat bahwa itu adalah snol tetapi bagaimana jika nilainya adalah nilai yang dikembalikan dari pemanggilan fungsi lain dan tidak disimpan dalam variabel apa pun? Bagaimanapun, jenis informasi ini bukanlah yang ingin Anda lacak di mesin virtual seperti mesin virtual .NET.
Untuk menghindari masalah ini, saya sarankan Anda melakukan pemeriksaan argumen null di semua panggilan metode publik (kecuali tentu saja Anda mengizinkan referensi null):
public void Foo(String s) {
if (s == null)
throw new ArgumentNullException("s");
Console.WriteLine(s.Length);
}
Jika null dilewatkan ke metode Anda mendapatkan pengecualian yang secara tepat menjelaskan apa masalahnya (yaitu snull).
Empat tahun kemudian Visual Studio 2017 sekarang memiliki pembantu pengecualian baru yang akan mencoba untuk memberitahu apa yang null ketika NullReferenceExceptiondilempar. Ia bahkan dapat memberi Anda informasi yang diperlukan jika itu adalah nilai kembalian dari metode yang nol:

Perhatikan bahwa ini hanya berfungsi dalam build DEBUG.