Wird die Methode mit einem Nullwert aufgerufen oder gibt sie eine Nullreferenzausnahme?
MyObject myObject = null;
myObject.MyExtensionMethod(); // <-- is this a null reference exception?
Wenn dies der Fall ist, muss ich meinen 'this'-Parameter niemals auf null überprüfen?
c#
parameters
null
extension-methods
tpower
quelle
quelle
Cannot perform runtime binding on a null reference
.Antworten:
Das wird gut funktionieren (keine Ausnahme). Erweiterungsmethoden verwenden keine virtuellen Aufrufe (dh sie verwenden die Anweisung "call" il, nicht "callvirt"), sodass keine Nullprüfung durchgeführt wird, es sei denn, Sie schreiben sie selbst in die Erweiterungsmethode. Dies ist in einigen Fällen tatsächlich nützlich:
usw
Grundsätzlich sind Aufrufe zu statischen Aufrufen sehr wörtlich - dh
wird:
wo es offensichtlich keine Nullprüfung gibt.
quelle
Ergänzung zur richtigen Antwort von Marc Gravell.
Sie könnten eine Warnung vom Compiler erhalten, wenn es offensichtlich ist, dass dieses Argument null ist:
Funktioniert gut zur Laufzeit, erzeugt aber die Warnung
"Expression will always cause a System.NullReferenceException, because the default value of string is null"
.quelle
Wie Sie bereits festgestellt haben, werden Erweiterungsmethoden, da es sich lediglich um verherrlichte statische Methoden handelt, mit übergebenen
null
Referenzen aufgerufen , ohneNullReferenceException
dass sie ausgelöst werden. Da sie für den Aufrufer jedoch wie Instanzmethoden aussehen, sollten sie sich auch als solche verhalten . Sie sollten dann meistens denthis
Parameter überprüfen und eine Ausnahme auslösen, wenn dies der Fall istnull
. Es ist in Ordnung, dies nicht zu tun, wenn sich die Methode explizit umnull
Werte kümmert und ihr Name dies ordnungsgemäß anzeigt, wie in den folgenden Beispielen:Ich habe vor einiger Zeit auch einen Blog-Beitrag darüber geschrieben.
quelle
Eine Null wird an die Erweiterungsmethode übergeben.
Wenn die Methode versucht, auf das Objekt zuzugreifen, ohne zu überprüfen, ob es null ist, wird eine Ausnahme ausgelöst.
Ein Typ hier hat die Erweiterungsmethoden "IsNull" und "IsNotNull" geschrieben, die überprüfen, ob die Referenz null übergeben wurde oder nicht. Persönlich denke ich, dass dies eine Aberration ist und nicht das Licht der Welt erblicken sollte, aber es ist vollkommen gültig, c #.
quelle
Wie andere betonten, führt das Aufrufen einer Erweiterungsmethode für die Nullreferenz dazu, dass dieses Argument null ist und nichts anderes Besonderes passiert. Dies lässt die Idee aufkommen, Erweiterungsmethoden zum Schreiben von Schutzklauseln zu verwenden.
In diesem Artikel finden Sie Beispiele: So reduzieren Sie die zyklomatische Komplexität: Schutzklausel Die Kurzversion lautet wie folgt:
Dies ist die String-Klassenerweiterungsmethode, die bei einer Nullreferenz aufgerufen werden kann:
Der Aufruf funktioniert nur, weil die Laufzeit die Erweiterungsmethode bei Nullreferenz erfolgreich aufruft. Dann können Sie diese Erweiterungsmethode verwenden, um Schutzklauseln ohne unübersichtliche Syntax zu implementieren:
quelle
Die Erweiterungsmethode ist statisch. Wenn Sie also an diesem MyObject nichts ändern, sollte dies kein Problem sein. Ein schneller Test sollte dies überprüfen :)
quelle
Es gibt nur wenige goldene Regeln, wenn Sie lesbar und vertikal sein möchten.
In Ihrem Fall - DesignByContract ist fehlerhaft ... Sie werden eine Logik für eine Nullinstanz ausführen.
quelle