/ / ArgumentNullException o NullReferenceException dal metodo di estensione? - .net, eccezione, metodi di estensione

ArgumentNullException o NullReferenceException dal metodo di estensione? - .net, eccezione, metodi di estensione

Quale considereresti la migliore eccezionedigitare da lanciare quando viene chiamato un metodo di estensione su un'istanza nulla (in cui il metodo di estensione non lo consente)? Poiché i metodi di estensione non sono altro che metodi statici, si potrebbe sostenere che dovrebbe essere ArgumentNullException, ma d'altra parte vengono utilizzati come metodi di istanza, quindi potrebbe essere più naturale utilizzare NullReferenceException. Prendiamo il seguente esempio:

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

In questo modo verrà generata una NullReferenceException se il parametro value è null.

L'altro esempio sarebbe:

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

MODIFICARE: In alcune delle risposte che hai indicatoun metodo di estensione può essere chiamato come un metodo statico e in quei casi un'eccezione di riferimento null sarebbe errata, che è un grande punto, e in realtà una delle mie preoccupazioni, non è sicuro del motivo per cui ho dimenticato di menzionarlo nella domanda in primo luogo .

Qualcuno ha anche sottolineato che è sbagliato lanciare una NullReferenceException, e sì, lo è. Ecco perché non lo lancio, lo lascio semplicemente (lascia che il CLR lo lanci) non proteggendo il metodo.

Penso di favorire l'ArgumentNullException (che èquello che ho usato fino ad ora) ma continuo a pensare che ci sia almeno spazio per argomentare contro la NullReferenceException dal momento che sembra più naturale nella maggior parte dei posti in cui verrà utilizzato il metodo.

risposte:

34 per risposta № 1

In generale, incluse le eccezioni, dovresti trattare un metodo di estensione come se fosse un normale metodo statico. In questo caso dovresti lanciare una ArgumentNullException.

Lanciare una NullReferenceException qui è una cattiva idea per alcuni motivi

  • Un riferimento null non si è verificato in realtà, quindi vederne uno è controintuitivo
  • Lanciare una NullReferenceException e causare aNullReferenceException a verificarsi produce eccezioni chiaramente diverse (un modo per vedere la differenza è il codice di errore). Questo è vero per molte eccezioni lanciate dal CLR.

Vedere Quando puoi prendere una StackOverflowException (un post che ho fatto su questo argomento).

  • È perfettamente legale chiamare un metodo di estensione come se fosse un metodo normale, in tal caso non escluderei certamente NullReferenceException, ma piuttosto ArgumentNullException.

21 per risposta № 2

A parte tutte le altre risposte (che sono buone)Penso che valga la pena guardare a ciò che Microsoft fa per coerenza ... e i metodi di estensione in Enumerable generano ArgumentNullException per quanto posso vedere.


6 per risposta № 3

Poiché i metodi di estensione possono essere utilizzati in C # 2.0 e possono essere chiamati solo come metodi statici (non è necessario utilizzarli come metodi di estensione), è necessario utilizzare ArgumentNullException.

Solo perché loro Guarda come i metodi sul tipo non significa che lo sono, o che sono sempre chiamati come uno.


1 per risposta № 4

Dal punto di vista dell'utente, il metodo sembra e si comporta come un metodo di istanza, quindi se fossi in loro, mi aspetterei di vedere una NullReferenceException.

Detto questo, suggerirei di lanciare l'uno o l'altro esplicitamente nel codice, invece di "accadere" semplicemente per lanciarne uno come nel tuo primo esempio.


1 per risposta № 5

ArgumentNullException. C'è no requisito per chiamare i metodi di estensione come se fossero metodi di istanza. Puoi chiamarli come se fossero normali metodi. NullReferenceException sarebbe completamente errato in quel caso.