2009-01-20 13 views
38

Was würden Sie als den besten auszuschließenden Ausnahmetyp erachten, wenn eine Erweiterungsmethode für eine Nullinstanz aufgerufen wird (wo die Erweiterungsmethode dies nicht zulässt)? Da Erweiterungsmethoden nichts anderes als statische Methoden sind, könnten Sie argumentieren, dass es ArgumentNullException sein sollte, aber andererseits werden sie wie Instanzmethoden verwendet, sodass es natürlicher ist, die NullReferenceException zu verwenden. Lassen Sie uns das folgende Beispiel nehmen:ArgumentNullException oder NullReferenceException von der Erweiterungsmethode?

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

diese Weise wird eine Nullreferenceexception wird ausgelöst, wenn der Wert Parameter null ist.

würde Das andere Beispiel sein:

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

EDIT: In einigen der Antworten, die Sie haben darauf hingewiesen, dass eine Verlängerung Methoden wie eine statische Methode aufgerufen werden kann, und in diesen Fällen eine null-Verweisausnahme wäre falsch, was ein großer Punkt ist, und eigentlich eines meiner Anliegen, nicht sicher, warum ich vergessen habe, das in der Frage an erster Stelle zu erwähnen.

Jemand wies auch darauf hin, dass es falsch ist, eine NullReferenceException zu werfen, und ja, ist es. Deshalb werfe ich es nicht weg, ich lasse es einfach geschehen (lass die CLR es werfen), indem du die Methode nicht bewahrst.

Ich denke, ich bevorzuge die ArgumentNullException (das ist, was ich bisher verwende), aber ich denke immer noch gibt es zumindest Platz für eine gegen die NullReferenceException zu argumentieren, da es an den meisten Orten, wo die Methode wird natürlich scheint verwendet werden.

Antwort

34

Im Allgemeinen Ausnahmen enthalten, sollten Sie eine Verlängerung Methode behandeln, als ob es eine normale statische Methode waren. In diesem Fall sollten Sie eine ArgumentNullException auslösen.

eine Nullreferenceexception hier Werfen ist eine schlechte Idee für ein paar Gründe

  • ein Null
  • Werfen eines Nullreferenceexception und verursacht eine Nullreferenceexception auftreten, so eigentlich nicht sehen auftreten produzieren discernably verschiedene Ausnahmen ein eingängig ist (Ein Weg, um den Unterschied zu sehen, ist der Fehlercode). Dies gilt für viele Ausnahmen, die von der CLR geworfen werden.

Siehe When can you catch a StackOverflowException (ein Beitrag, den ich zu diesem Thema gemacht habe).

  • Es ist vollkommen legal, eine Erweiterungsmethode als eine normale Methode zu bezeichnen. In diesem Fall würde ich sicherlich keine NullReferenceException, sondern stattdessen eine ArgumentNullException verwenden.
  • +0

    Große Kommentare und wie ich in meinem Beitrag zu diesem Thema erwähne dies ist der Grund, warum ich nicht explizit die NullReferenceException zu werfen, ließ ich noch die CLR es werfen. –

    +0

    "Eine Nullreferenz ist nicht wirklich aufgetreten". Ja, tat es; Sie haben eine Nullreferenz übergeben und die Methode hat versucht, sie zu dereferenzieren. – piedar

    +0

    @piedar die Methode versucht, es zu dereferenzieren, nicht die Laufzeit! –

    1

    Aus Sicht des Benutzers sieht das Verfahren und wirkt wie eine Instanzmethode, also wenn ich sie wäre, würde ich erwarten, dass eine Nullreferenceexception zu sehen.

    Das heißt, ich würde vorschlagen, entweder das eine oder das andere explizit im Code zu werfen, anstatt nur „passiert“ ein wie in Ihrem ersten Beispiel zu werfen.

    +0

    Ja, ich habe daran gedacht, die NullReferenceException explizit zu werfen, aber mein Gefühl ist, dass es wirklich für den Compiler reserviert sein sollte, aber Sie können sehr wohl Recht haben. –

    +2

    Aus Sicht des Benutzers kann eine Erweiterungsmethode sowohl als Erweiterung als auch als statische Methode aufgerufen werden. – JaredPar

    1

    ArgumentNullException. Es gibt keine Anforderung, Erweiterungs-Methoden aufzurufen, als ob sie Instanzmethoden wären. Sie können sie wie normale Methoden aufrufen. NullReferenceException wäre in diesem Fall völlig inkorrekt.

    6

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

    Nur weil sie aussehen wie Methoden auf den Typ bedeutet nicht, dass sie sind, oder werden immer wie einer genannt.

    19

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

    +0

    Tolle Idee, ich hatte das selbst, habe es nicht getan, nicht sicher warum! ;-) –

    +1

    Dies ist eine nützliche Technik, die ich sehr oft benutze. Man sollte jedoch immer daran denken, dass die FCL nicht nur eine Methode verwendet, um etwas zu erreichen, sondern auch, dass die Methode optimal oder korrekt ist. Ich empfehle FCL-Methoden als Vorschläge, wie man etwas erreichen kann, aber der Verdienst einer bestimmten Methode sollte mit Alternativen verglichen werden, bevor beurteilt wird, ob es die beste Wahl ist. –

    Verwandte Themen