Parametry referencyjne ref

0

Czy może ktoś mi dosadniej wytłumaczyć, w którym momencie "tracona" jest wartość

w Mainie mam wywołanie takich metod

SportsCar.SetMaxSpeedRequirement(200);
SportsCar.SetHorsepowerRequirement(250);

po tych dwóch wywołaniach mam takie (również w Main()):

Calculator.NumberCruncher();

Klasa Calculator wygląda nastepująco:

class Calculator
{
    public static void NumberCruncher()
    {
        int sportsCarMaxSpeedReq = 3;
        int sportsCarHorsePowerReq = 4;
        SportsCar.GetMinimumRequirements( ref sportsCarMaxSpeedReq, ref sportsCarHorsePowerReq);
        //Przetwarzanie liczb

        Console.WriteLine("Wartość zmiennej sportsCarMaxSpeedReq: {0}", sportsCarMaxSpeedReq);
        Console.WriteLine("Wartość zmiennej sportsCarHorsePowerReq: {0}", sportsCarHorsePowerReq);

    }
}

Wywołuje ona metodę statyczną ze SportsCar, która wygląda tak:

   public static void GetMinimumRequirements( ref int newMaxSpeed, ref int newHorsepower)
    {
        newMaxSpeed = maxSpeedRequirement;
        newHorsepower = horsepowerRequirement;

        Console.WriteLine("Wartości z wnętrza metody GetMinimumReguirements: {0} {1}", newMaxSpeed, newHorsepower);
        //dopisałem to, by sprawdzić wartość zmiennych jeśli nie ma parametru "ref"

    }

Wiem, że jeśli parametr ma dopisane ref to po wyjściu z metody nie wraca do wartości, którą miała przed wykonaniem metody, tylko już zostaje zmieniona.

Chciałem się spytać tylko w którym momencie jest w tym kodzie ten moment "porzucenia" wartości.
Jeśli usunę w metodzie statycznej GetMinimumRequirements przedrostek ref oraz w Main() też nie podam ref to wartości są różne.

Nie wiem czy dosyć jasno to opisałem. Jeśli jest przedrostek ref to wypisuje mi w obu przypadkach wartości 200 i 250. Natomiast jak nie dam ref to wartości są równe 3 i 4.

Czy dzieje się to jeśli wychodzimy z metody GetMinimumRequirements i wartości już są tracone(te 200 i 250)?

1

Nie ma żadnego porzucenia wartości ani wracania, to nie tak działa.

Jeśli do metody przekazywany jest parametr bez ref, to metoda robi sobie kopię tej wartości i na niej operuje. Po zakończeniu metody kopia tej zmiennej już oczywiście nie istnieje. Natomiast metoda zewnętrzna cały czas posiada pierwotne wartości.
Jeśli dodasz ref, to metoda nie będzie tworzyła kopii zmiennych, tylko będzie operowała na oryginalnych wartościach, tych otrzymanych "z zewnątrz".

0

jest jeszcze out . które nie wymaga aby zmienna była zainicjowana jak przy ref.

0

No ok czyli rozumiem. Tak. Wiem, że jest też out. No nic. To dziękuję za rozjaśnienie ;)

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