2008-09-19 9 views
12

ich in einem anderen Beitrag bemerkt hatte jemand so etwas getan:System.Convert.ToInt vs (int)

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

Warum sie die Funktion convert verwendet haben, statt:

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

die hat einen impliziten Floor und konvertiert.

Auch mehr Besorgnis erregend, bemerkte ich in einiger Code Produktion Ich lese:

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

Ist das das gleiche wie:

float f = (float)d; 

Sind die alle sonst impliziten Konvertierungen nur in der Convert-Klasse der Vollständigkeit halber oder dienen sie einem Zweck? Ich kann eine Notwendigkeit für .ToString() verstehen, aber nicht den Rest.

Antwort

12

zu int Casting ist implizite Abschneiden, nicht implizite Boden:

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

ich wählen Math.Floor oder Math.Round zu meinen Absichten deutlicher zu machen.

1

Sie können Convert verwenden, wenn Sie eine Zeichenfolge, die Sie in ein int

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

Konvertieren und Gießen konvertieren wollen sowohl eine Ausnahme auslösen, wenn sie scheitern.

das heißt, das wird noch eine Ausnahme auslösen, ist es nicht 0 zurück:

Convert.ToInt32("1234NonNumber"); 

In vielen Fällen konvertieren und Gießen wird das gleiche Ergebnis, aber ein gegossenes ist oft leichter zu lesen.

+0

Vertauscht 'Int32.Parse (String): Int32' tatsächlich eine Zeichenfolge in ein int? –

+0

Int32.Parse konvertiert eine "numerische" Zeichenfolge in ein int und es wird eine Ausnahme ausgelöst, wenn die Konvertierung fehlschlägt. Int32.TryParse gibt false zurück, wenn die Konvertierung während der Konvertierung fehlschlägt.ToInt32 gibt 0 zurück, wenn die Konvertierung fehlschlägt. –

1

Convert.ToInt32() wird für Strings verwendet (http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx), während das Casting nur für Typen mit internen Konvertern (numerische Typen) verwendet werden kann. Der eigentliche Trick kommt bei der Entscheidung zwischen Int32.Parse und Convert.ToInt32(). Convert.ToInt32() toleriert einen Nullparameter und gibt 0 zurück, während Int32.Parse() eine ArgumentNullException auslöst.

3

Gerundet wird auch anders gehandhabt:

x = -2,5 (int) x = -2 Convert.ToInt32 (x) = - 2
x = -1,5 (int) x = -1 konvertieren. 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 Beachten Sie die Fälle x = -1,5 und x = 1,5.
In einigen Algorithmen ist die verwendete Rundungsmethode entscheidend, um die richtige Antwort zu erhalten.