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

 

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

Πρόβλημα με DIRECTCAST Int σε Byte

Îåêßíçóå áðü ôï ìÝëïò Ηλίας Κεκάκος. Τελευταία δημοσίευση από το μέλος KelMan στις 05-05-2007, 19:45. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-05-2007, 10:52 31460

    Πρόβλημα με DIRECTCAST Int σε Byte

        Προσπαθώ να μετατρέψω ένα C# προγραμμα σε VB με την βοήθεια του SHARPDEVELOPER και έχω το παρακάτω πρόβλημα:

    C#: m_cmdCustomersInsert.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.Int, 4, ParameterDirection.ReturnValue, false, ((System.Byte)(0)), ((System.Byte)(0)), "", DataRowVersion.Current, null));

    Translation to VB.NET: m_cmdInsertCustomers.Parameters.Add(New SqlParameter("@RETURN_VALUE", SqlDbType.Int, 4, ParameterDirection.ReturnValue, False, (DirectCast((0), Byte)), (DirectCast((0), Byte)), "", DataRowVersion.Current, Nothing))

    Το πρόβλημα είναι στο (DirectCast((0), Byte)) και το μύνημα λάθους είναι: Value of type 'Integer' cannot be converted to 'Byte'

    Πιό είναι το λάθος στην μετάφραση;

  •  05-05-2007, 11:48 31463 σε απάντηση της 31460

    Απ: Πρόβλημα με DIRECTCAST Int σε Byte

    Αντί για

    DirectCast((0), Byte))

    χρησιμοποίησε

    CType(0, System.Byte)

    Υπάρχει μια σύγχυση για τη χρήση αυτών των δύο και πολλοί προτιμούν την DirectCast χωρίς να το σκεφτούν δεύτερη φορά απλά και μόνο επειδή είναι πιο γρήγορη. Πότε χρησιμοποιούμε την μία και πότε την άλλη λοιπόν;

    Ας πούμε ότι θέλουμε να μετατρέψουμε το string "11111" σε integer (για την ακρίβεια System.Int32). Αν πούμε

    Dim s as String = "11111"

    Dim x As Integer = CType(s, Integer)

    θα πετύχει γιατί κάτι τέτοιο είναι εφικτό (όπως λέει και το MSDN "CType succeeds as long as there is a valid conversion defined between the expression and the type"). Αν όμως πούμε

    Dim x As Integer = DirectCast(s, Integer)

    θα αποτύχει γιατί όπως διαβάζουμε "DirectCast requires the run-time type of an object variable to be the same as the specified type". Πότε θα συμβεί αυτό; Στην περίπτωση που πούμε:

    Dim οbj as Object = "abcdefg"

    Dim s As String = DirectCast(obj, String)

    Μπορεί το παραπάνω να μοιάζει αρχικά κάπως παράδοξο καθώς έχουμε συνηθίσει να θεωρούμε τον τύπο String ως έναν απλό τύπο αλλά ο λόγος που πετυχαίνει είναι ότι στο .NET, το String κληρονομεί τον τύπο System.Object. Έτσι, η DirectCast δεν κάνει καμία "πραγματική" δουλειά, δεν "επεξεργάζεται" το οbj, απλά βάζει ένα νέο reference σε μια υπάρχουσα περιοχή μνήμης. Όπως φαίνεται, γι αυτόν ακριβώς τον λόγο είναι γρήγορη αλλά κι επικίνδυνη καθώς αν τα περιεχόμενα του obj δεν είναι ήδη στον κατάλληλο τύπο, τότε θα έχουμε run-time error. Επιπρόσθετα, η CType είναι VB.NET specific, δηλαδή χρησιμοποιεί τις βοηθητικές βιβλιοθήκες της VB.NET, ενώ τη DirectCast τη συναντάμε και στη C#. Βέβαια, όταν λέμε "πιο γρήγορη" εννοούμε ότι έχει περίπου διπλάσια ταχύτητα όταν πρόκειται για value types ενώ για reference types είναι λίγο-πολύ το ίδιο.

    Τέλος, ρίξε μια ματιά εδώ: http://www.codeproject.com/dotnet/CheatSheetCastingNET.asp για την περίπτωση που χρειαστείς να κάνεις μετατροπές από κώδικα C# σε VB.NET και ο converter δεν τα βγάζει πέρα...


    Vir prudens non contra ventum mingit
  •  05-05-2007, 13:38 31464 σε απάντηση της 31460

    Απ: Πρόβλημα με DIRECTCAST Int σε Byte

    Ακόμα καλύτερα, μην βάλεις καθόλου casts! Είναι εντελώς περιττά, και στον αρχικό κώδικα, και στη VB. Μπορείς άνετα να γράψεις:

    m_cmdInsertCustomers.Parameters.Add(New SqlParameter("@RETURN_VALUE", SqlDbType.Int, 4, ParameterDirection.ReturnValue, False, 0, 0, "", DataRowVersion.Current, Nothing))

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  05-05-2007, 19:45 31470 σε απάντηση της 31464

    Απ: Πρόβλημα με DIRECTCAST Int σε Byte


    Και να θες να το ψάξεις, πώς είναι δυνατόν να ισχύει αυτό που λέει ο Παναγιώτης, ξεκίνα από εδώ:

    http://www.codeguru.com/csharp/.net/net_general/il/article.php/c4667/

    Wink


    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems