[C#] Jak skopiować obiekt
| ptysiowaty |
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. |
|
|
| somekind |
10-03-2010 21:29 |
|
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/ |
|
|
| ozi88 |
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); } } |
|
|
| dark_astray |
10-03-2010 21:34 |
|
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 |
|
|
| somekind |
10-03-2010 23:17 |
|
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/ |
|
|
| Azarien |
11-03-2010 00:09 |
|
Użytkownik Status: Online Dołączył: 18-12-2003 |
Jaki problem zrobić sobie własny interfejs.. albo dać sobie spokój z interfejsem i po prostu zaimplementować te metody. Ostatnio zmodyfikowany: 11-03-2010 00:10 przez Azarien |
|
|
| dark_astray |
11-03-2010 00:21 |
|
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 |
|
|
| somekind |
11-03-2010 00:30 |
|
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? ![]() 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/ |
|
|
| dark_astray |
11-03-2010 00:37 |
|
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 |
|
|
| somekind |
11-03-2010 09:58 |
|
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/ |
|
|
|
|
|
| 1 użytkownik(ów) przegląda ten temat (1 gości) |
|---|
| (żadnych zarejestrowanych użytkowników) |












