Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Re: C# ή VB.NET ?

  •  03-04-2005, 20:45

    Re: C# ή VB.NET ?

    Χίχι. Με αυτό τον τρόπο αποκάλυψες την ηλικία σου. Πόσος κόσμος κάτω από τα 30 θυμάται ότι η VB έκανε το rounding με αυτό τον τρόπο επειδή κάποτε η Microsoft ήθελε να την προωθήσει στον επιχειρηματικό κόσμο? Devil Γιατί οπουδήποτε αλλού το 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:





    .method
    public static void Main() cil managed
    {
       .custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
       .entrypoint
       // Code Size: 21 byte(s)
       .maxstack 1
       .locals ( float64 num1, int32 num2)
       L_0000: nop
       L_0001: ldc.r8 1,5
       L_000a: stloc.0
       L_000b: ldloc.0
       L_000c: call float64 [mscorlib]System.Math::Round(float64)
       L_0011: conv.ovf.i4
       L_0012: stloc.1
       L_0013: nop
       L_0014: ret
    }



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Δείτε όλες τις δημοσιεύσεις της Θεματική Ενότητας
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems