Χίχι. Με αυτό τον τρόπο αποκάλυψες την ηλικία σου. Πόσος κόσμος κάτω από τα 30 θυμάται ότι η VB έκανε το rounding με αυτό τον τρόπο επειδή κάποτε η Microsoft ήθελε να την προωθήσει στον επιχειρηματικό κόσμο?

Γιατί οπουδήποτε αλλού το round απαιτείται να είναι συγκεκριμμένο, ή πάνω ή κάτω. Φαντάσου να συμπεριφερόταν έτσι ένας αλγόριθμος MP3 ...
Το πρόβλημα του τύπου ήταν ότι ήθελε να κάνει cast σε Int, όχι round. Και η VB δεν έχει κάποιο τρόπο να κάνεις cast χωρίς round, τουλάχιστον χωρίς να καταφύγεις στο Framework και την Convert. Και το CType και το CInt καλούν πρώτα την Round και μετά κάνουν cast σε Integer. Πέρα από το αναπάντεχο αποτέλεσμα, αυτή η συμπεριφορά σημαίναι ότι καλείται ένα παραπανίσιο function σε κάθε cast, κάτι που μπορεί να έχει επίπτωση όταν μετατρέπονται πολλοί αριθμοί, π.χ. ένας πίνακας με doubles.
Αυτό είναι ένα από τα πιο αθώα παραδείγματα για το πως η VB παραβαίνει το principle of least surprise. Είναι μάλιστα τόσο παλιό που θα στοιχημάτιζα ότι ο αρθρογράφος έχει πολύ καιρό να δουλέψει με VB.
Η C# πάντως δεν χρησιμοποιεί τη round όταν κάνεις cast. Ο IL κώδικας για τον παρακάτω κώδικα:
public static void Main()
{
double fi=1.5;
int i=(int)fi;
}
είναι:
.method public hidebysig static void Main() cil managed { .entrypoint // Code Size: 14 byte(s) .maxstack 1 .locals ( float64 num1, int32 num2) L_0000: ldc.r8 1,5 L_0009: stloc.0 L_000a: ldloc.0 L_000b: conv.i4 L_000c: stloc.1 L_000d: ret }
Προφανώς, η C# κάνει κανονικό cast, ενώ η VB πρώτα καλεί την Round και μετά κάνει cast:
|
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos