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

 

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

Περίεργο ( ; ) πρόβλημα με μεταβλητή...

Îåêßíçóå áðü ôï ìÝëïò spiliot. Τελευταία δημοσίευση από το μέλος KelMan στις 09-08-2006, 09:16. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-08-2006, 19:07 15589

    Περίεργο ( ; ) πρόβλημα με μεταβλητή...

    Στον παρακάτω κώδικα Visual Basic.net 2003:

        Dim strTemp as String
        Dim DataField As DataDefinitionFields
        DataField = DefinitionLoaders.DataDefinitionList(0)
        strTemp = "106"
        If DataField.Value <> strTemp Then
            DataField.PreviousValue = DataField.Value
            DataField.Value = strTemp
        end if


    Στον παραπάνω κώδικα, το DataDefinitionFields είναι ένα structure και το DefinitionLoaders.DataDefinitionList είναι ένα arraylist που περιέχει DataDefinitionFields.

    Υποθέτω ότι με την DataField = DefinitionLoaders.DataDefinitionList(0) δημιουργώ έναν pointer στο DataField που δείχνει στο DefinitionLoaders.DataDefinitionList(0), ουσιαστικά δηλαδή χειρίζομαι το ίδιο το DefinitionLoaders.DataDefinitionList(0)... Τουλάχιστον το MSDN έτσι λέει ή έτσι καταλαβαίνω...

    Το περίεργο είναι ότι όταν εκτελείται ο κώδικας, το DataField ενώ περιέχει τις τιμές του DefinitionLoaders.DataDefinitionList(0), ποτέ δεν τις ενημερώνει!

    Δηλαδή η DataField.Value παίρνει την τιμή της strTemp, αλλά κοιτώντας στο watch το DefinitionLoaders.DataDefinitionList(0) δεν ενημερώνεται η τιμή εκεί!

    Τι λάθος κάνω; Μήπως τελικά το "=" δεν συνδέει τις δύο μεταβλητές αλλά ορίζει στην νέα τις τιμές της πρώτης; Τότε η Set της VB6 πως έχει μεταφερθεί στην .net;
  •  08-08-2006, 20:21 15591 σε απάντηση της 15589

    Απ: Περίεργο ( ; ) πρόβλημα με μεταβλητή...

    Θέλει λίγο προσοχή γιατί το Structure είναι value type, πράγμα που σημαίνει ότι όταν λές DataField = DefinitionLoaders.DataDefinitionList(0), το DataField ΔΕΝ είναι pointer αλλά απλά ένα copy των τιμών του item 0. Αν αντί για Structure χρησιμοποιήσεις class (reference type), θα παίζει ο κώδικας μια χαρά. Για παραπάνω πληροφορίες ψάξε στο MSDN για value types και reference types.
    Vir prudens non contra ventum mingit
  •  09-08-2006, 01:38 15592 σε απάντηση της 15589

    Απ: Περίεργο ( ; ) πρόβλημα με μεταβλητή...

    Ευχαριστώ πολύ για την απάντηση (τόσο γρήγορα μέσα στο καλοκαίρι δεν το περίμενα!), πράγματι αυτό ήταν και δεν γνώριζα την διαφορά...

    Το πρόβλημά μου το έλυσα περνώντας την τιμή της προσωρινής μεταβλητής πίσω στο collection item στο τέλος των εργασιών.

    Αυτό που δεν μπόρεσα να καταλάβω, είναι πως μπορώ να χρησιμοποιήσω class για να κάνω την ίδια δουλειά όπως την περιέγραψα στην αρχή. Το structure είναι το παρακάτω...

    Structure DataDefinitionFields
        Dim ID As Integer
        Dim Name As String
        Dim ActionListName As String
        Dim Enabled As Boolean
        Dim Type As DataDefinition.enumDataType
        Dim TriggerActionOn As DataDefinition.enumTriggerOn
        Dim TriggerOnPercent As Integer
        Dim Value As Object
        Dim PreviousValue As Object
    End Structure
  •  09-08-2006, 09:16 15593 σε απάντηση της 15592

    Απ: Περίεργο ( ; ) πρόβλημα με μεταβλητή...

    Με παρόμοιο τρόπο μπορείς να ορίσης Class:



    Class DataDefinitionFields
        Public ID As Integer
        Public Name As String
        Public ActionListName As String
        Public Enabled As Boolean
        Public Type As DataDefinition.enumDataType
        Public TriggerActionOn As DataDefinition.enumTriggerOn
        Public TriggerOnPercent As Integer
        Public Value As Object
        Public PreviousValue As Object
    End Class

    Πλέον, κάθε φορά που θες να βάλεις ένα item στη λίστα σου, θα κάνεις



    Dim oItem as New DataDefinitionFields
    oItem.ID = ...
    oItem.Name=...
    ...
    'Υποθέτουμε ότι η λίστα υποστηρίζει Add method
    DefinitionLoaders.DataDefinitionList.Add(oItem)


    Βέβαια, συνήθως κάνουμε το παρακάτω:



    Class DataDefinitionFields
        Private _ID As Integer
        Private _Name As String
        Private _ActionListName As String
        ...
        ...

    Public Property ID as Integer
       Get
          Return _ID
       End
       Set(value as Integer)
          _ID=value
       End
    End Property
         
    'Και αντίστοιχα για τα υπόλοιπα properties
    ...
    ...

    End Class

    Με αυτόν τον τρόπο μπορείς να ενσωματώσεις λογική κατά τη στιγμή που διαβάζεις ένα property (πχ x=oItem.ID) όπου εκτελείται το Get ή κατά τη στιγμή που ορίζεις ένα property (oItem.ID=x)

     

     


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