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

 

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

C# Force Pass-By-Value?

Îåêßíçóå áðü ôï ìÝëïò pontifikas. Τελευταία δημοσίευση από το μέλος Δημήτρης Γκανάτσιος στις 04-08-2007, 10:37. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  03-08-2007, 23:17 34090

    C# Force Pass-By-Value?

    Υπάρχει τρόπος να αναγκάσω ένα όρισμα σε μιά συνάρτηση να περάσει με τιμή?
    Αντιμετωπίζω το εξής πρόβλημα:
    Έχω ένα πολύ όμορφο Generic, το SortedList<Foo,Foobar> beautifulGeneric,  το οποίο και περνάω σαν όρισμα σε μιά συνάρτηση για να αποθηκευτεί κάπου(σε ένα άλλο όμορφο genericStick out tongue)
    Το πρόβλημά μου είναι ότι περνάει και αποθηκεύεται με αναφορά, με αποτέλεσμα ,επειδή αποθηκεύω πολλά τέτοια , στο τέλος όλα να έχουν τα περιεχόμενα του τελευταίου που αποθήκευσα.
    Δυστυχώς η SortedList Δεν έχει κάποια Clone ή κάτι τέτοιο, και πριν φτοιάξω ξεχωριστή συνάρτηση είπα να ρωτήσω μπας και υπάρχει γενικά κάποιος άλλος τρόπος.

    Ευχαριστώ Smile
  •  04-08-2007, 00:15 34091 σε απάντηση της 34090

    Απ: C# Force Pass-By-Value?

    Το reference του object περνιέται by value. Για να κάνεις αυτό που θες, πρέπει να στείλεις σαν όρισμα έναν κλώνο. Μπορείς να κάνεις φτιάξεις δικό σου SortedList που να κάνει inherit το SortedList, implement το ICloneable και μετά να προσθέσεις αυτή την συνάρτηση

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public SortedList<Foo,Foobar> Clone()
    {
    BinaryFormatter bFormatter = new BinaryFormatter();
    MemoryStream stream = new MemoryStream();
    bFormatter.Serialize(stream, this);
    stream.Seek(0, SeekOrigin.Begin);
    SortedList<Foo,Foobar> newobj = SortedList<Foo,Foobar>bFormatter.Deserialize(stream);
    return newobj;
    }

     

    Αυτή κάνει το απαραίτητο deep copy. Προϋπόθεση είναι τα Foo και Foobar (και, πιθανώς, ότι άλλο object "κρέμεται" από κάτω τους) να είναι <Serializable>, ώστε να μπορούν να γίνουν serialize στο memory stream.

    edit: κάνουμε deep copy γιατί στο SortedList κρέμονται objects τύπου Foo και Foobar, οπότε δεν μας βολεύει το shallow copy Wink


    Dimitris-Ilias Gkanatsios
    Developer Evangelist, Microsoft Hellas

    My Blog
    StudentGuru
    Twitter
    Facebook
  •  04-08-2007, 10:03 34095 σε απάντηση της 34091

    Απ: C# Force Pass-By-Value?

    Το φαντάστηκα ότι δεν μπορεί να γίνει απλά.
    Τώρα τι εννοείς Shallow copy και deep copy?

    Εγώ έκανα αυτό τελικά:

    public static SortedList<Point, NeighbourhoodPoint> SortedLists_Copy(SortedList<Point, NeighbourhoodPoint> List)
    {
        SortedList<Point, NeighbourhoodPoint> retVal = new SortedList<Point, NeighbourhoodPoint>(new PointComparer());

        foreach (KeyValuePair<Point, NeighbourhoodPoint> pair in List)
        {
            retVal.Add(pair.Key, pair.Value);
        }

    return retVal;
    }

    Έχω μια υποψία ότι είναι αυτό που εννοείς Shallow Copy αλλά γιατί είναι τόσο διαφορετικό?? Τι πρόβλημα δημιουργούν τα αντικείμένα μέσα στην λίστα?
  •  04-08-2007, 10:31 34096 σε απάντηση της 34095

    Απ: C# Force Pass-By-Value?

    Μπορείς να δεις το άρθρο του Varad C#: Shallow Copy


    while (!dead) learn();
  •  04-08-2007, 10:37 34097 σε απάντηση της 34095

    Απ: C# Force Pass-By-Value?

    δες κι εδώ. Smile
    Dimitris-Ilias Gkanatsios
    Developer Evangelist, Microsoft Hellas

    My Blog
    StudentGuru
    Twitter
    Facebook
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems