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.
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. –
"Eine Nullreferenz ist nicht wirklich aufgetreten". Ja, tat es; Sie haben eine Nullreferenz übergeben und die Methode hat versucht, sie zu dereferenzieren. – piedar
@piedar die Methode versucht, es zu dereferenzieren, nicht die Laufzeit! –