(Informationen zum neuen Ausnahme-Helfer in Visual Studio 2017 finden Sie am Ende dieser Antwort.)
Betrachten Sie diesen Code:
String s = null;
Console.WriteLine(s.Length);
Dies wirft ein NullReferenceExceptionin die zweite Zeile und Sie möchten wissen, warum .NET Ihnen nicht sagt, dass es snull war, als die Ausnahme ausgelöst wurde.
Um zu verstehen, warum Sie diese Informationen nicht erhalten, sollten Sie sich daran erinnern, dass nicht die C # -Quelle ausgeführt wird, sondern IL:
IL_0001: ldnull
IL_0002: stloc.0 // s
IL_0003: ldloc.0 // s
IL_0004: callvirt System.String.get_Length
IL_0009: Rufen Sie System.Console.WriteLine auf
Es ist der callvirtOpcode, der das auslöst, NullReferenceExceptionund das tut es, wenn das erste Argument auf dem Auswertungsstapel eine Nullreferenz ist (die, die mit geladen wurde ldloc.0).
Wenn .NET erkennen soll, dass es sich sum eine Nullreferenz handelt, sollte es in gewisser Weise nachverfolgen, dass das erste Argument auf dem Evaluierungsstapel aus einer Form stammt s. In diesem Fall ist es für uns leicht zu erkennen, sdass es null war, aber was ist, wenn der Wert ein Rückgabewert eines anderen Funktionsaufrufs war und nicht in einer Variablen gespeichert wurde? Auf jeden Fall ist diese Art von Informationen nicht das, was Sie in einer virtuellen Maschine wie der virtuellen .NET-Maschine verfolgen möchten.
Um dieses Problem zu vermeiden, schlage ich vor, dass Sie in allen öffentlichen Methodenaufrufen eine Argument-Null-Prüfung durchführen (es sei denn, Sie erlauben natürlich die Null-Referenz):
public void Foo(String s) {
if (s == null)
throw new ArgumentNullException("s");
Console.WriteLine(s.Length);
}
Wenn null an die Methode übergeben wird, erhalten Sie eine Ausnahme, die genau beschreibt, wo das Problem liegt ( sdh null).
Vier Jahre später hat Visual Studio 2017 jetzt einen neuen Ausnahme-Helfer, der versucht zu erkennen, was null ist, wenn a NullReferenceExceptionausgelöst wird. Es kann Ihnen sogar die erforderlichen Informationen geben, wenn es sich um den Rückgabewert einer Methode handelt, die null ist:

Beachten Sie, dass dies nur in einem DEBUG-Build funktioniert.