Wysyłanie obiektu przez wartość

0
static void SendAPersonByValue(Person p)
        {
            p.personAge = 99;

            Person p1 = new Person("ktos", 100);
            p = p1;
        }

Person fred = new Person("Fred", 12);
            fred.Display();
            Console.WriteLine();

            SendAPersonByValue(fred);
            fred.Display();

Wysyłajac obiekt przez wartość wiek się zmieni, natomiast imię się nie zmieni ponieważ do obiektu p w metodzie zostaje wpisany nowy adres i ten poprzedni zostaje zgubiony, dobrze to rozumiem ?

0

Nie prześlesz obiektu Person poprzez wartość. Dobry artykuł na ten temat => http://www.albahari.com/valuevsreftypes.aspx

0

Obiekty nie są wysyłane przez wartość tylko przez referencje. Przez wartość albo przez referencje możesz przesyłać jedynie typy proste. W Twoim przypadku masz taką sytuację, że najpierw tworzysz Freda (zapewne w metodzie Main) później przekazujesz adres tego obiektu do funkcji SendAPersonByValue. Na początku jest tworzona nowa zmienna Person p która będzie wskazywała na adres freda. Później zmieniasz wiek na 99 (u freda), tworzysz nowy obiekt p1 i przypisujesz do zmiennej p jej adres (fred cały czas istnieje a trzymany jest w metodzie Main), ponieważ p tylko wskazuje na adres komórki pamięci to stworzenie tego obiektu p1 i przypisanie go do p jest tylko zmianą adresu. Po wyjściu z metody SendAPersonByValue obiekt p (teraz już "ktoś", 100) jest czyszczony bo nie jest dłużej wykorzystywany

0

Nie wiem, co chcesz osiągnąć, ale jeśli chcesz w metodzie zmienić referencję obiektu na inny, wtedy powinieneś przekazać referencję do referencji do tego obiektu. Jak? No tak:

Jak przekazujemy int przez wartość?

void IntByValue(int i)
{
}

Jak przekazujemy int przez referencję?

void IntByRef(ref int i)
{

}

A teraz jak przekazujemy obiekt przez wartość? Bzzzz - nie da się. Obiekt jest wysyłany przez referencję. No dobra, a co się stanie, jeśli zrobię:

void SecretResult(ref Person p)
{

}

W taki sposób przekażesz referencję do referencji do obiektu p ;)

Czyli jeśli teraz zrobisz coś takiego:

void Start()
{
  Person p = new Person("Tymek", 20);
  ReplacePerson(ref p);
  
  MessageBox.Show(p.Name);
}

void ReplacePerson(ref Person p)
{
  p = new Person("Tytus", 30);
}

Zobaczysz, że obiekt został zmieniony. Metoda ReplacePerson uśmierciła Tymka, a w jego miejsce urodziła Tytusa.

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