2010-08-03 19 views
8

Usiamo il framework .NET 2.0 con C# 3.0 (penso che sia l'ultima versione di C# che può essere eseguita sulla versione 2.0 del framework, correggimi se sbaglio).Un modo migliore per controllare i parametri?

Esiste qualcosa in C# che può rendere più conveniente questo tipo di convalida dei parametri?

public ConnectionSettings(string url, string username, string password, 
          bool checkPermissions) 
{ 
    if (username == null) { 
     throw new ArgumentNullException("username"); 
    } 

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

    if (String.IsNullOrEmpty(url)) { 
     throw new ArgumentException("Must not be null or empty, it was " + 
      (url == null ? url : "empty"), "url"); 
    } 

    this.url = url; 
    this.username = username; 
    this.password = password; 
    this.checkPermissions = checkPermissions; 
} 

Questo tipo di convalida dei parametri diventa un modello e risultati comuni in un sacco di codice "quasi boilerplate" a guadare attraverso nei nostri metodi pubblici.

Se non c'è nulla di integrato. Ci sono grandi librerie libere che potremmo usare?

+0

penso che questa linea necessità cambiare per evitare un'eccezione riferimento null? (url == null? Url: "vuoto"), "url"); a (url == null? "Null": "vuoto"), "url"); – w69rdy

+0

Stai cercando uno strumento di programmazione orientata agli aspetti. So che ci sono alcuni là fuori, che si integrano con Visual Studio e iniettano il codice negli assembly IL in fase di compilazione. Ma non riesco a far funzionare il mio google stamattina. – Will

+0

Dovresti essere in grado di mettere a punto alcuni metodi di convenienza per fornire la maggior parte delle funzionalità, ma sono d'accordo, sarebbe bello avere dello zucchero sintetico per questo. Sono particolarmente stufo di lanciare due eccezioni separate per i due casi di stringhe.IsNullOrEmpty – cristobalito

risposta

4

Io di solito creare metodi di supporto statici ...

Ad es

public static void CheckNotNull(object value, string parameterName) 
{ 
    if(value == null) { throw new ArgumentNullException(parameterName); } 
} 

significa che è possibile condensare il codice fino a qualcosa di simile a qui sotto e solo lo rende un po 'più ordinato.

CheckNotNull(username, "username"); 
CheckNotNull(password, "password"); 

Oppure si può avvolgere in su come un metodo di estensione:

public static void CheckNotNull<T>(this T value, string parameterName) 
{ 
    if(value == null) { throw new ArgumentNullException(parameterName); } 
} 

E utilizzare come:

username.CheckNotNull("username"); 
password.CheckNotNull("password"); 

E se ti senti veramente fantasia, probabilmente si potrebbe interrogare il nomi dei parametri usando la riflessione. Reflection è un po 'lento, quindi lo faresti solo se dovessi lanciare un'eccezione, ma ti risparmia digitando il nome del parametro letterale per tutto il tempo.

+0

Richiede comunque di inserire il nome del parametro in una stringa (che hai convenientemente omesso). –

+0

Ben, in effetti è stato un errore ma fissato prima del downvote. – Ian

+0

E ho annullato il downvote ora che vedo che l'hai risolto. –

2

Si può fare usando i contratti ma è lo stesso concetto.

Questa dovrebbe essere comunque una buona pratica, perché mostra chiaramente quali sono campi obbligatori su un metodo pubblico.

3

Here's a nice fluent way di fare questo.

What are your favorite extension methods for C#? (codeplex.com/extensionoverflow)

public static class Extensions 
{ 
     public static void ThrowIfArgumentIsNull<T>(this T obj, string parameterName) where T : class 
     { 
       if (obj == null) throw new ArgumentNullException(parameterName + " not allowed to be null"); 
     } 
} 

internal class Test 
{ 
     public Test(string input1) 
     { 
       input1.ThrowIfArgumentIsNull("input1"); 
     } 
} 
+0

Giorgi ha già menzionato questo metodo. Inoltre ... hai ancora quella brutta stringa con il nome del parametro. –

2

Simile idea alla validazione dei parametri fluente come menzionato da Giorgi, ma questo evita di denominare ridondante il parametro e le stringhe che non possono essere automaticamente aggiornate dagli strumenti di refactoring del codice.

http://charlieflowers.wordpress.com/tag/parameter-validation/

4

È possibile usare un il tessitore come Post Sharp, tenere a mente che il compilatore come un servizio in C# 5 renderà questo tipo di cose costruito.

Personalmente non consiglierei questo approccio, a meno il problema è enorme e deve essere affrontato. Solitamente alcune affermazioni e il controllo delle precondizioni come descritto sopra sono una best practice.

EG:

public ConnectionSettings(
    [NotNullOrEmpty] string url, 
    [NotNull] string username, 
    [NotNull] string password, 
    bool checkPermissions) 
{ 
    this.url = url; 
    this.username = username; 
    this.password = password; 
    this.checkPermissions = checkPermissions; 
} 

Si potrebbe anche integrare questo tipo di cose con code contracts che permetterebbe di eseguire qualche ricco analisi statica.

Problemi correlati