Jeśli mamy referencje do danego obiektu i przesyłamy go przez wartość do metody to w metodzie jest kopia tej referencji do obiektu. I jeśli jest to kopia to czemu może zmieniać dane dla głównego obiektu?
Bo to kopia referencji a nie kopia obiektu?
Referencja jest jak skierowanie do tego samego lekarza, nie ważne ilu różnym osobom, na każde zapytanie od odpowie ten sam specjalista. Jeśli chcesz innego rezultatu musisz mieć zupełnie nowe skierowanie, w C# służy do tego słowo kluczowe "new".
To jeśli wysyłam kopie referencji to jakby tworzę kopię głęboką? A jak wysyłam oryginał referencji wtedy tworzę kopię płytką?
jesli to nie jest value type (jak struct, enum czy prymityw) to do funkcji zawsze wysylasz referencje a nie obiekt
kopie referencji albo oryginał referencji
jesli to nie jest value type (jak struct, enum czy prymityw) to do funkcji zawsze wysylasz referencje a nie obiekt.
Ale chyba kopie referencji?
Możesz wysłać referencje, albo jej kopie, ale nie obiekt.
Zmienne definiowane jako klasa działają jako referencje do obiektu przechowywanego w pamięci. I to właśnie te zmienne wysyłasz czy kopiujesz.
Obiekt jest cały czas jeden dopóki go jawnie nie sklonujesz
Nie ma różnicy czy przesyłasz referencję czy kopię referencji - to nadal referencje do tego samego obiektu
Jeśli mam taką funkcję i przesyłam kopię referencji do obiektu klasy Osoba:
static void Funkcja(Osoba p)
p.wiek = 10;
p = new Osoba("Tadeusz",25);
to dlaczego do referencji p nie można przypisać nowej referencji?
Do p
jak najbardziej możesz.
Ale dlatego, że przesyłasz kopię referencji, to zmiana ta nie jest widoczna na zewnątrz funkcji, bo zmieniasz tylko to na co wskazuje ta twoja lokalna kopia.
static void Funkcja(Osoba p)
{
p = new Osoba("Tadeusz",25);
p.wiek = 10;
}
To jak w funkcji zmienię to na co pokazuje kopia referencji i dalej wykonam instrukcję p.wiek = 10, to już nie powinno zmienić tego obiektu po za funkcją na wiek = 10, a jednak zmienia.
Jednak wtedy już nie zmienia czyli jest ok.