2009-08-24 5 views
6

In C#, le istanze dei tipi di riferimento vengono passate alle funzioni come puntatore nullable. Si consideri ad esempio:Come documentare la "non-nullableness" dei tipi di riferimento in C#?

public void f(Class classInstanceRef) 

Nella maggior parte dei casi, la funzione si aspetta un puntatore non nullo (nel 95% dei casi nella mia esperienza). Qual è il modo migliore per documentare il fatto che questa funzione si aspetta un puntatore non nullo?

Aggiornamento: grazie mille per le vostre risposte finora!

risposta

17

1) Assicurarsi che il metodo respinge ogni nullo

if (instanceRef == null) 
{ 
    throw new ArgumentNullException("instanceRef"); 
} 

2) Aggiungere

/// <exception cref="T:System.ArgumentNullException"> is thrown 
/// when <paramref name="instanceRef"/> is <c>null</c></exception> 

L'eccezione generata quando un nulla di riferimento (Nothing in Visual di base) è passato a un metodo che fa non lo accetta come argomento valido (MSDN)

+4

Invece di 'ArgumentException' dovresti usare' ArgumentNullException'. –

+1

Non vorresti usare invece 'ArgumentNullException'? – LukeH

+1

Non sarebbe preferibile lanciare un'eccezione ArgumentNullException invece di ArgumentException? –

3
Debug.Assert(classInstanceRef != null); 
+1

che ora quello che definirei la documentazione ... Quante volte si fa a controllare l'output di debug del vostro programma? –

+1

Se si compila in modalità di debug, viene visualizzata una finestra di dialogo di asserzione in fase di runtime. Quanto più in faccia lo vuoi? –

19

In .NET 4, si avrà la possibilità di utilizzare code contracts, che hanno lo scopo proprio per questo genere di cose:

Contract.Requires(classInstanceRef != null); 

Nel frattempo, penso che una corretta documentazione e gettando un ArgumentNullException è accettabile.

4

Partenza biblioteca contratti codice: http://research.microsoft.com/en-us/projects/contracts/

Vi permette di specificare le pre-condizioni per il codice e lo hanno verificato tramite l'analisi statica del codice di base:

Contract.Requires(x ! = null); 

La biblioteca sarà incluso in .NET Framework v 4 e ci sono licenze commerciali per le versioni precedenti del framework.

-1
if(classInstanceRef == null) { throw new NullReferenceException("classInstanceRef"); } 

?

///<remarks>classInstanceRef cannot be null</remarks> 
+2

Non si dovrebbe lanciare una NulLReferenceException (come da linee guida http://msdn.microsoft.com/en-us/library/ms229007.aspx).Preferisco invece l'uso di ArgumentNullException. –

+0

anzi, il pensiero pigro per conto mio ... non lo farebbe nel mio codice. – Massif

2

farei qualcosa di simile:

/// <summary> 
/// Does stuff 
/// </summary> 
/// <param name="classInstanceRef">some documentation</param> 
/// <exception cref="ArgumentNullException">Thrown when the <paramref name="classInstanceRef"/> is null.</exception> 
public void f(Class classInstanceRef) 
{ 
    if (classInstanceRef == null) 
    throw new ArgumentNullException("classInstanceRef"); 
} 
Problemi correlati