2010-08-11 19 views
7

quali sono le migliori pratiche per le conversioni di tipo in C#?Quali sono le migliori pratiche per la conversione di tipo sicuro in C#?

int temp=System.ConvertToInt32(Request.QueryString["Id"]); 
    if (temp!=null) 
     { // logic goes here } 

Questo non riesce se Id risulta in qualche modo rivela 'abc'

prega di consulenza l'uso di operatori ternari e le altre dichiarazioni singola linea a parte se else (come l'utilizzo di un'unica linea operatori ternari). Inoltre, voi ragazzi preferite TryParse over Convert & perché così? Dai la tua opinione.

+1

Temp non sarà mai nullo nella stringa sopra –

risposta

7

TryParse ha il vantaggio evidente che in caso di guasto tornerà falso anziché un'eccezione.

Il modello standard sarebbe qualcosa di simile:

int value; 
if (int.TryParse(Request.QueryString["Id"], out value)) 
{ 
    // Use value 
} 
else 
{ 
    // Do whatever you want on failure 
} 

Ora, è anche la pena tenendo presente che si può dare int.TryParse un IFormatProvider e un NumberStyles - per esempio, si potrebbe voler specificare CultureInfo.InvariantCulture come IFormatProvider se questo è veramente pensato per essere un ID generato automaticamente (piuttosto che uno inserito da un utente).

Se si desidera avere in modo efficace "valori di default" si potrebbe scrivere un metodo di supporto come questo:

public static int? NullableTryParseInt32(string text) 
{ 
    int value; 
    return int.TryParse(text, out value) ? value : (int?) null; 
} 

È quindi possibile utilizzare questo modo:

int value = NullableTryParseInt32(text) ?? 10; 

Oppure si può semplicemente scrivere un metodo che prende un valore predefinito, ovviamente :)

+0

Ciao Jon, grazie per la risposta. Come faresti questa affermazione con un operatore ternario? Inoltre, non è quella 'out' inizializzata ogni volta che valuto, corrisponde o non corrisponde? Non dovremmo evitare tryParse solo per questo? –

+0

@Popo: Sì, il parametro 'out' è inizializzato in entrambi i modi, ma perché dovresti evitare' TryParse' per questo? Ho aggiunto un altro paio di opzioni per semplificare questo nel caso in cui un valore predefinito abbia un senso - ma molto spesso la prima forma è davvero quella da seguire. –

+0

Grazie Jon, Would TryParse restituisce solo vero/falso? Posso verificare eccezioni in TryParse come ha fatto Sunrisas nell'uso di Converti? –

0

utilizzare il metodo TryParse della classe int.

int temp; 
if (int.TryParse(Request.QueryString["Id"], out temp) 
    { // logic goes here } 

Se id non contiene un numero TryParse restituirà false.

UPDATE: cambiato per mostrare int.TryParse

+0

per me non sembra avere un metodo tryparse ... Sei sicuro di non voler digitare int.TryParse? – Chris

+0

Non è la temperatura esterna di una preoccupazione qui? –

+0

Penso che tu voglia usare int.TryParse non ci siano string.TryParse, dopotutto perché dovresti analizzare una stringa in una stringa ;-) –

1

Quando si tratta di risolvere qualsiasi problema che ha diverse soluzioni simili, cerco anche di trovare quello che esprime al lettore del codice quello che sto cercando di realizzare il cleæret. Nella mia opinione questo significa andare in .TryParse in questo caso particolare.

Utilizzando TryParse dice al lettore che non si ha la garanzia che l'ingresso è valido (se si dovesse userei analizzare invece) E dal momento che si è in realtà cercando per analizzare l'input come un int si potrebbe anche lasciare che il codice letto linea vostre intenzioni

1

Ci sono due modi per farlo

int i; 
if (Int32.TryParse(Request.QueryString["Id"], out i)) 
{ 
} 

o si può fare:

try 
{ 
    Convert.ToInt32(Request.QueryString["Id"]); 
} 
catch (FormatException ex) 
{ 
    // The field Id it's not convertible 
} 
catch (Exception ex) 
{ 
    // It could throw also ArgumentException or OverflowException 
} 
+0

Ciao sinisas, come posso rilevare le eccezioni in tryParse? –

+0

Bene, puoi metterlo in una dichiarazione try catch. L'unica eccezione che TryParse può lanciare, per quanto ne so, è ArgumentException, ma in questo caso suppongo che passerai sempre una stringa, quindi non otterrai mai tale eccezione. L'idea alla base di TryParse non è quella di utilizzare un'istruzione try catch, in quanto restituisce true o false a seconda del successo della conversione –

1

utilizzando TryParse sarebbe l'opzione migliore. L'eccezione di cattura dal metodo di conversione è un'operazione costosa.Naturalmente TryParse accetta solo stringhe mentre Convert.ToInt32 accetta oggetti e può eseguire conversioni (unboxing, down-casting da long/double) oltre all'analisi.

1

Per coprire l'aspetto operatore ternario di questa domanda:

Il mio consiglio per l'uso degli operatori ternari è non usarli se non si è già così familiarità con il codice in questione che si legge naturalmente a voi . La concisione rende il famiglio più familiare e lo strano, estraneo.

Quando hai interrotto la discussione su TryParse qui abbastanza che non hai nemmeno bisogno di pensarci più a fondo, la conversione da if-else a?: Non sarà banale, sarà automatica. Fino ad allora, aggiungerai solo alla tua confusione.

Quando non ho familiarità con qualcosa, per prima cosa faccio un salto al codice "baby-speak", imparo la nuova cosa e poi la integro nel mio stile più normale dopo.

+0

Grazie per il consiglio Jon. –

Problemi correlati