2008-09-19 5 views
12

J'ai remarqué dans un autre poste, quelqu'un avait fait quelque chose comme:System.Convert.ToInt vs (int)

double d = 3.1415; 
int i = Convert.ToInt32(Math.Floor(d)); 

Pourquoi ont-ils utilisé la fonction de conversion, plutôt que:

double d = 3.1415; 
int i = (int)d; 

qui a un sol implicite et convertit.

En outre, plus inquiétant, je remarquais dans un code de production, je lisais:

double d = 3.1415; 
float f = Convert.ToSingle(d); 

Est-ce la même chose que:

float f = (float)d; 

sont toutes les conversions autrement implicites juste dans la classe Convert pour l'exhaustivité, ou servent-ils un but? Je peux comprendre un besoin de .ToString(), mais pas le reste.

Répondre

12

à int est troncature implicite, non plancher implicite:

double d = -3.14; 
int i = (int)d; 
// i == -3 

Je choisis Math.Floor ou Math.Round pour faire mes intentions plus explicites.

1

Vous pouvez utiliser convert lorsque vous avez une chaîne que vous souhaitez convertir en un int

int i = Convert.ToInt32("1234"); 

Convertir et casting sera à la fois lancer une exception si elles échouent.

i.e., ce sera toujours jeter une exception, il ne reviendra pas 0:

Convert.ToInt32("1234NonNumber"); 

Dans de nombreux cas Convertir et coulée aura le même résultat, mais un casting est souvent plus facile à lire.

+0

Est-ce que 'Int32.Parse (String): Int32' convertit réellement une chaîne en int? –

+0

Int32.Parse convertira une chaîne "numérique" en int et lancera une exception si la conversion échoue. Int32.TryParse retournera false si la conversion échoue lors de la conversion.ToInt32 retournera 0 si la conversion échoue. –

1

Convert.ToInt32() est utilisé sur les chaînes (http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx) tandis que la diffusion ne peut être utilisée que sur les types dotés de convertisseurs internes (types numériques). Le vrai tour vient de décider entre Int32.Parse et Convert.ToInt32(). Convert.ToInt32() est tolérant à un paramètre nul et renvoie 0 tandis que Int32.Parse() lancera une ArgumentNullException.

3

Arrondi est également gérée différemment:

x = -2,5 (int) = -2 x Convert.ToInt32 (x) = - 2
x = -1,5 (int) = x -1 Convert. ToInt32 (x) = - 2
x = -0,5 (int) x = 0 Convert.ToInt32 (x) = 0
x = 0,5 (int) x = 0 Convert.ToInt32 (x) = 0 x =
1,5 (int) x = 1 Convert.ToInt32 (x) = 2
x = 2,5 (int) = x 2 Convert.ToInt32 (x) = 2

no les cas x = -1,5 et x = 1,5 cas.
Dans certains algorithmes, la méthode d'arrondi utilisée est essentielle pour obtenir la bonne réponse.