/ / ArgumentNullException oder NullReferenceException von Erweiterungsmethode? - .net, Ausnahme, Erweiterungsmethoden

ArgumentNullException oder NullReferenceException von der Erweiterungsmethode? - .net, Ausnahme, Extension-Methoden

Was wäre für Sie die beste AusnahmeTyp, der ausgegeben wird, wenn eine Erweiterungsmethode für eine Nullinstanz aufgerufen wird (wobei die Erweiterungsmethode dies nicht zulässt)? Da Erweiterungsmethoden nichts anderes als statische Methoden sind, könnte man argumentieren, dass es sich um ArgumentNullException handeln sollte. Andererseits werden sie wie Instanzmethoden verwendet, sodass die Verwendung der NullReferenceException natürlicher sein kann. Nehmen wir das folgende Beispiel:

public static string ToInvariantString(this IFormattable value, string format)
{
return value.ToString(format, CultureInfo.InvariantCulture);
}

Auf diese Weise wird eine NullReferenceException ausgelöst, wenn der value-Parameter null ist.

Das andere Beispiel wäre:

public static string ToInvariantString(this IFormattable value, string format)
{
if (value == null) throw new ArgumentNullException("value");
return value.ToString(format, CultureInfo.InvariantCulture);
}

BEARBEITEN: In einigen Antworten haben Sie darauf hingewiesenEine Erweiterungsmethode kann wie eine statische Methode aufgerufen werden, und in diesen Fällen wäre eine Ausnahme für eine Nullreferenz falsch. Dies ist ein großartiger Punkt und eigentlich eines meiner Anliegen .

Jemand hat auch darauf hingewiesen, dass es falsch ist, eine NullReferenceException zu werfen, und ja, das ist es. Deshalb werfen wir es nicht, ich lasse es einfach passieren (lassen Sie die CLR es werfen), indem Sie die Methode nicht schützen.

Ich denke, ich bevorzuge die ArgumentNullException (das "s")was ich bisher verwendet habe), aber ich denke immer noch, dass es zumindest Raum gibt, um gegen eine NullReferenceException zu argumentieren, da es an den meisten Stellen, an denen die Methode verwendet wird, natürlicher erscheint.

Antworten:

34 für die Antwort № 1

Im Allgemeinen sollten Sie eine Erweiterungsmethode wie eine normale statische Methode behandeln. In diesem Fall sollten Sie eine ArgumentNullException auslösen.

Das Auslösen einer NullReferenceException hier ist aus verschiedenen Gründen eine schlechte Idee

  • Eine Nullreferenz ist tatsächlich nicht aufgetreten, daher ist es nicht intuitiv, einen zu sehen
  • Eine NullReferenceException auslösen und eineDurch das Auftreten einer NullReferenceException werden erkennbar unterschiedliche Ausnahmen erzeugt (Eine Möglichkeit, den Unterschied zu erkennen, ist der Fehlercode). Dies gilt für viele Ausnahmen, die von der CLR ausgelöst werden.

Sehen Wann können Sie eine StackOverflowException abfangen? (ein Beitrag, den ich zu diesem Thema gemacht habe).

  • Das Aufrufen einer Erweiterungsmethode ist genauso legal, als wäre es eine reguläre Methode. In diesem Fall würde ich sicherlich keine NullReferenceException, sondern eine ArgumentNullException ausnehmen.

21 für die Antwort № 2

Abgesehen von allen anderen Antworten (die gut sind)Ich denke, es lohnt sich zu sehen, was Microsoft aus Gründen der Konsistenz tut ... und die Erweiterungsmethoden in Enumerable werfen ArgumentNullException so weit ich kann.


6 für die Antwort № 3

Da Erweiterungsmethoden in C # 2.0 verwendet werden können und wie statische Methoden aufgerufen werden können (Sie MÜSSEN sie nicht als Erweiterungsmethoden verwenden), sollten Sie ArgumentNullException verwenden.

Nur weil sie aussehen Gleiche Methoden auf dem Typ bedeuten nicht, dass sie immer als eine oder als solche bezeichnet werden.


1 für die Antwort № 4

Vom Standpunkt des Benutzers aus sieht die Methode aus und verhält sich wie eine Instanzmethode. Wenn ich sie wäre, würde ich erwarten, dass sie eine NullReferenceException sehen würde.

Das heißt, ich würde vorschlagen, entweder den einen oder den anderen explizit in den Code zu werfen, anstatt nur "zu passieren", um einen zu werfen, wie in Ihrem ersten Beispiel.


1 für die Antwort № 5

ArgumentNullException. Es gibt Nein Erfordernis, Erweiterungsmethoden aufzurufen, als wären sie Instanzmethoden. Sie können sie als normale Methoden bezeichnen. NullReferenceException wäre in diesem Fall völlig falsch.