Kopiowanie obiektów

0

Mamy kod:

B = A;

Zmienne A i B sa obiektami.

Podejście 1: "Niech wskaźnik B wskazuje na ten sam obszar pamięci, co wskaźnik A."

Podejście 2: "Zbuduj obiekt B identyczny, jak obiekt A, wskaźniki A i B wskazują na dwa rozłączne obszary pamięci, których zawartość jest identyczna."

Pierwsze podejście jest zastosowane w przypadku obiektów, na przykład typu "Bitmap", a drugie jest w przypadku zmiennej typu "int", "string" itp.

Na przykład jest program:

Bitmap A = new Bitmap(320,240);
Bitmap B = new Bitmap(320,240);

// instrukcje rysujące na bitmapie A

B = A;

// ???

Zastosowane jest podejście 1, czyli jak w miejscu ??? dopisze się dalsze operacje na bitmapie A, to rysunek zmieni się również na bitmapie B.

A jak ja potrzebuję mieć kopie rysunku, to na przykład mogę wykonać przerysowanie wszystkich pikseli w pętli, ale to chyba nie najlepszy sposób.

Czy istnieje uniwersalny sposób wymuszający podejście 2, działający na obiektach dowolnego typu?

0

Nie ma uniwersalnego sposobu. Każda klasa jest specyficzna, mogą posiadać jakieś otwarte zasoby, strumienie, nie można po prostu skopiować kawałka pamięci. Jednak standardem w .NET Framework jest to, że gdy autor chce umożliwić proste skopiowanie obiektu, implementuje interfejs ICloneable i w przypadku bitmapy wystarczy zrobić: B = A.Clone();

0
Bitmap A = new Bitmap(320,240);
//...
Bitmap B = new Bitmap(A);
0
ttt napisał(a)

Zmienne A i B sa obiektami.

Podejście 1: "Niech wskaźnik B wskazuje na ten sam obszar pamięci, co wskaźnik A."

Podejście 2: "Zbuduj obiekt B identyczny, jak obiekt A, wskaźniki A i B wskazują na dwa rozłączne obszary pamięci, których zawartość jest identyczna."

Pierwsze podejście jest zastosowane w przypadku obiektów, na przykład typu "Bitmap", a drugie jest w przypadku zmiennej typu "int", "string" itp.

Po pierwsze nie wskaźnik, tylko referencja.
Po drugie int i string to też obiekty.
Po trzecie istnieją typy przekazywane przez wartość (wyliczeniowe oraz struktury, w tym bool i typy liczbowe) oraz przez referencje (klasy, interfejsy, delegaty). Te przekazywane przez wartość są trzymane na stosie, a przy przypisaniu do nowej zmiennej są kopiowane, te referencyje siedzą na stercie, a przy przypisywaniu do nowej zmiennej przypisywana jest tylko referencja ze względu na oszczędzanie pamięci i procesora.
Po czwarte string to inna bajka, bo jest typem referencyjnym, ale po utworzeniu obiektu tego typu nie można już go zmienić. Dlatego przy przypisywaniu do nowej zmiennej zachowuje się jakby był typem wartościowym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1