[C#] Jak skopiować obiekt

szukaj na forum nowy temat odpowiedz

Strona [ 1 2 >> ] z 2

ptysiowaty ten post 10-03-2010 20:14


Użytkownik
Status: Offline
Dołączył: 26-02-2006

Pytanie początkującego:Jak najprościej (bez dużej ilości kodu) "skopiować" obiekt danej klasy. Chodzi mi o to, żeby móc operować na kopii nie wpływając na obiekt pierwotny. Łatwiej mi będzie zrozumieć na przykładzie,  tak więc (przykład został mocno okrojony dla przejrzystości):

 
public class track

    {
        public List<int> order = new List<int>();
    }

        private track opt(track opt_track)
        {
            track old_track = opt_track;
            old_track.order.Reverse(); // i tu mi odwróci kolejność oczywiście w obydwu obiektach
            return old_track;
        }


Więc pytanko oczywiście jak to zrobić, żeby odwrócił mi wartości tylko w old_track, zostawiając opt_track w spokoju. O referencji coś tam wiem, ale zawsze mam tego typu problemy. Proszę tylko o tłumaczenie w sposób zrozumiały dla zielonych. Z góry dzięki.
Przejdź na górę strony
cytuj
somekind ten post 10-03-2010 21:29
avatar

Użytkownik
Status: Offline
Dołączył: 01-03-2008
Skąd: Polska, mieszkam w Polsce
Się zastanawiam co to za zmienna ten "track", a to u Ciebie klasa. Weź pisz nazwy klas wielką literą, będzie łatwiej czytać.

Jak rozumiem chcesz sklonować swój obiekt. Najprościej chyba użyć w tym celu serializacji binarnej, czyli np umieścić taką metodę w klasie Track:
public Track Clone()
{
        using (MemoryStream ms = new MemoryStream())
        {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, this);
                ms.Seek(0, SeekOrigin.Begin);
                return bf.Deserialize(ms);
        }
}

Samotranscendencja jest prafenomenem ewolucji.
Dzieci należy trzymać z dala od Internetu. Od dzieci Internet głupieje.
www.somekind.pl
http://bykom-stop.avx.pl/
Przejdź na górę strony
cytuj
ozi88 ten post 10-03-2010 21:32


Użytkownik
Status: Offline
Dołączył: 01-11-2008

Można by też trochę prościej:

    class Person
    {
        public string imie;
        public int wiek;

        public Person(Person person)
        {
            this.imie = person.imie;
            this.wiek = person.wiek;
        }

        public Person()
        {
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Person> ludzie = new List<Person>
            {
                new Person(), new Person(), new Person()
            };

            List<Person> ludzieKopia = new List<Person>();
            ludzie.ForEach(x => ludzieKopia.Add(new Person(x)));
            ludzie[0].imie = "Jan";
            ludzie[0].wiek = 35;

            Console.WriteLine(ludzieKopia[0].imie);
            Console.WriteLine(ludzieKopia[0].wiek);
        }
    }
Przejdź na górę strony
cytuj
dark_astray ten post 10-03-2010 21:34
avatar

Użytkownik
Status: Offline
Dołączył: 16-12-2009

http://www.csharp411.com/c-object-clone-wars/

Różne sposoby kopiowania obiektów.
Chyba najprostszy to implementacja dla danej klasy - interfeju ICloneable
www.heller-consult.pl/

www.youtube.com/user/michal1988xx
Przejdź na górę strony
cytuj
somekind ten post 10-03-2010 23:17
avatar

Użytkownik
Status: Offline
Dołączył: 01-03-2008
Skąd: Polska, mieszkam w Polsce
@ozi88 - jeśli dodasz nowe pole czy właściwość w klasie, to będziesz musiał zmienić swoją metodę. Ja swojej nie będę musiał.
@dark_astray:
1) Implementowanie ICloneable to rozwiązanie do dupy, bo po pierwsze Clone zwraca nieładny typ object, a po drugie nie wiadomo, czy ma zwracać kopię płytką czy głęboką, czy w takim przypadku dla drugiego typu kopii trzeba robić inną metodę i jaką ją nazwać, itd., itp. Ktoś korzystający z tego niekoniecznie będzie wiedział co ta metoda zwraca.
Poza tym, żeby zaimplementować trzeba mieć pomysł jak to zrobić. Ty go jakoś nie podałeś, więc czemu piszesz, że to najprostsze?
Samotranscendencja jest prafenomenem ewolucji.
Dzieci należy trzymać z dala od Internetu. Od dzieci Internet głupieje.
www.somekind.pl
http://bykom-stop.avx.pl/
Przejdź na górę strony
cytuj
Azarien ten post 11-03-2010 00:09
avatar

Użytkownik
Status: Online
Dołączył: 18-12-2003

Jaki problem zrobić sobie własny interfejs..
    interface ICopyable<T>
    {
        T ShallowCopy();
        T DeepCopy();
    }

albo dać sobie spokój z interfejsem i po prostu zaimplementować te metody.

Ostatnio zmodyfikowany: 11-03-2010 00:10 przez Azarien
Przejdź na górę strony
cytuj
dark_astray ten post 11-03-2010 00:21
avatar

Użytkownik
Status: Offline
Dołączył: 16-12-2009

somekind napisał:
Ty go jakoś nie podałeś, więc czemu piszesz, że to najprostsze?


Jest w linku ktory podałem... zerknij.
www.heller-consult.pl/

www.youtube.com/user/michal1988xx
Przejdź na górę strony
cytuj
somekind ten post 11-03-2010 00:30
avatar

Użytkownik
Status: Offline
Dołączył: 01-03-2008
Skąd: Polska, mieszkam w Polsce
@Azarien - oczywiście żaden. Ale własny, to nie jest już ICloneable, nie? ;)

@dark_astray - Ty piszesz, że najprościej zaimplementować metodę Clone, a w linku jest kilka sposobów implementacji tej metody. Więc jak w końcu? ;P
Samotranscendencja jest prafenomenem ewolucji.
Dzieci należy trzymać z dala od Internetu. Od dzieci Internet głupieje.
www.somekind.pl
http://bykom-stop.avx.pl/
Przejdź na górę strony
cytuj
dark_astray ten post 11-03-2010 00:37
avatar

Użytkownik
Status: Offline
Dołączył: 16-12-2009

Konkretnie chodziło mi o ten sposob z memberwiseClone.
W linku jest kilka sposobów na skopiowanie obiektu. Kolega na początku pisze że jest początkujący, a implementacja ICloneable z memberwiseclone to nie jest problem, jak widać. Nie twierdze że najlepszy sposób, bo wcale taki nie jest, ale jest prosty.
Niepotrzebna dyskusja.
www.heller-consult.pl/

www.youtube.com/user/michal1988xx

Ostatnio zmodyfikowany: 11-03-2010 00:40 przez dark_astray
Przejdź na górę strony
cytuj
somekind ten post 11-03-2010 09:58
avatar

Użytkownik
Status: Offline
Dołączył: 01-03-2008
Skąd: Polska, mieszkam w Polsce
Ale MemberwiseClone nie działa dla typów referencyjnych, prawda? A kolega początkujący może o tym nie wiedzieć, coś mu nie będzie działało i nie będzie wiedział dlaczego. ;)
Samotranscendencja jest prafenomenem ewolucji.
Dzieci należy trzymać z dala od Internetu. Od dzieci Internet głupieje.
www.somekind.pl
http://bykom-stop.avx.pl/
Przejdź na górę strony
cytuj
szukaj na forum nowy temat odpowiedz

Strona [ 1 2 >> ] z 2

1 użytkownik(ów) przegląda ten temat (1 gości)
(żadnych zarejestrowanych użytkowników)

Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0639 sek. (zapytań SQL: 9)