2011-02-09 13 views
17

Una domanda sopravvenuto lavoro oggi su come convertire un oggetto nel suo tipo specifico (un int), ho detto a lanciarlo:Perché utilizzare Convert.ToInt32 su casting?

int i = (int)object; 

un collega ha detto di usare Convert.ToInt32().

int i = Convert.ToInt32(object) 

Qual è la differenza tra Convert.ToInt32() e un cast oggetto diretto?

risposta

16

Non tutti gli oggetti possono essere trasmessi direttamente a int. Ad esempio, il seguente non compilare:

string s = "1"; 
int i = (int)s; 

perché string non è implicitamente convertibile in int.

Tuttavia, questo è legale:

string s = "1"; 
int i = Convert.ToInt32(s); 

Come nota a margine, sia casting e Convert può generare eccezioni se l'oggetto di input non può essere convertito. Tuttavia, int.TryParse non lancia se fallisce; piuttosto, restituisce false (ma ci vuole solo in una stringa, quindi bisogna .ToString() l'oggetto di ingresso prima di utilizzarlo):

object s = "1"; 
int i; 
if(int.TryParse(s.ToString(), out i)) 
{ 
    // i now has a value of 1 
} 
+0

La parola che stai cercando è "esplicitamente" nel secondo "paragrafo" - implicito sarebbe 'int i = s'. –

1

si può lanciare solo quando il tipo di originale ha un cast definito per il nuovo tipo . Quindi, la trasmissione da un tipo numerico all'altro (ad esempio da long ad int) è normalmente possibile ma il casting da tipi non numerici a tipi numerici (ad esempio da stringa a int) normalmente non è possibile. Convert offre molti altri metodi per modificare questi tipi non numerici in numerici, quindi il motivo per usarli è che è meno probabile che si verifichi un errore.

0

Se si conosce che l'istanza boxed è un int, è possibile utilizzare in modo sicuro l'operatore di cast (int) per annullarlo. Tuttavia, se è convertibile in un int interno (ad esempio un float), l'utilizzo dell'operatore di cast fallirà in fase di esecuzione.

Controllare la documentazione della classe Convert per ulteriori dettagli sulle conversioni specifiche che consente e non consente.

1

Io preferisco lo Convert solo perché fornisce un'interfaccia uniforme e uniforme alla conversione. Ad esempio, Convert.ToInt32("45") funziona ma (int)"45", no.

Convert segnalerà inoltre problemi come il lancio di un OverflowException. La trasmissione può essere pericolosa in quanto il cast da dire a lungo a un int potrebbe produrre un risultato scarso e il runtime non lo dirà.

Mi piace anche che esista lo Convert.ToX(object obj), che consente di sparare a Convert e per lo più dimenticarlo.

+2

Sulla tua seconda affermazione; quello che hai detto è vero nel caso di default, ma potresti racchiudere il cast in un blocco "controllato", che genererà un ArithmeticOverflowException in questi casi. – KeithS

9

Essi sono fondamentalmente differenti

Casting dice che l'oggetto è un esempio del tipo di essere lanciato a, quindi lanciarlo.

Convert afferma che esiste una conversione tra i tipi convertiti.

Quindi, ad esempio, non è possibile eseguire il cast di una stringa su un int, ma è possibile convertirlo. Vi sono aree grigie/sovrapposte dovute a determinate regole di cast incorporate per tipi primitivi o conversioni di cast esplicite che è possibile aggiungere ai propri tipi. Ma generalmente non penserei a questi due come all'equivalente.

Dato che non esiste un'opzione "migliore", è necessario utilizzare l'opzione che ha senso nel contesto specificato.

+8

Penso che sia una questione di intenti. Il casting dice chiaramente "So che sei un 'int'!" mentre Convert dice "Non ho idea di cosa tu sia, ma alla fine so che sarai un' int' " – Greg

+0

Sì - molto bello modo di spiegarlo - grazie. –

0

La differenza è Convert.ToInt32(object value) proverà a utilizzare IConvertible per convertire il valore in int in cui come cast diretto verrà semplicemente generata un'eccezione se tale cast non è valido.

Gli altri sovraccarichi provano anche convertendo e non casting.

1

Convert.ToInt32 è fondamentalmente lo stesso come int.Parse Con una differenza: se si utilizza int.Parse (null) viene generata un'eccezione, mentre Convert.ToInt32 restituisce 0

Casting d'altra parte è un'operazione più complessa e funzionerà solo se il valore è realmente un valore di un valore int o un valore boxed boxed/unboxed che può essere convertito implicitamente.

(boxe è una rappresentazione oggetto di un tipo valore)

1

Convertire è una classe che contiene una serie di metodi statici e si suppone sia utilizzato per convertire tipi di base, i tipi supportati sono booleana, Char, SByte , Byte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Decimal, DateTime e String. L'operatore di trasmissione ti consente di fare la stessa cosa ma puoi usarlo anche per altri tipi, inclusi i tipi che crei. Puoi anche definire questi operatori nelle tue classi, permettendoti di convertire da qualsiasi cosa a qualcosa. Questa è la differenza, uno è un metodo e l'altro è un operatore, non ho controllato il coraggio dell'operaror durante la conversione e l'int in una stringa, ma potrebbe avere la stessa logica dei metodi in Convert.

Problemi correlati