Wpis z mikrobloga

Oglądam sobie filmik o słowie kluczowym "ref". Dobrze rozumiem, że jak mam zmienną b i przepuszczę ją przez metodę używając słowa ref, to zmiany zostaną zastosowane zarówno wewnątrz metody używając wartości b, jak i do zmiennej b poza metodą?

Po co coś takiego robić? Czy nie wyszłoby na to samo, jakbym zamiast:

Metoda(ref b);
zrobił tak?

b = Metoda(b);
I nie byłoby potrzeba wymyślać żadnych refów.

#csharp #programowanie
Goryptic - Oglądam sobie filmik o słowie kluczowym "ref". Dobrze rozumiem, że jak mam...

źródło: comment_1620648971gGlHaXRN7gzkE7URIU0SeH.jpg

Pobierz
  • 8
@Goryptic: oczywiście lepiej tego nie używać, ale czasami się przydaje. Np. bez tego mechanizmu nie zrobisz funkcji swap. Inny przypadek to jakieś funkcje niskopoziomowe, gdzie chcemy, żeby kod był wydajny a taki mechnizm bardzo prosto jest mapowany na assemblera. Analogiczna operacja w stylu b = Metoda(b) może nie zostać zoptymalizowana w odpowiedni sposób, zwłaszcza jak takich argumentó masz dużo
@Goryptic: np. do własnych impementacji metod podobnych do .TryParse, do najprostszych walidacji z returnem. Czasem zamiast zwracać tuple/słownik/keyvaluepair można użyc ref, ale prawie zawsze można to napisać bez.

A w ogóle w tym przykładzie z obrazka to ref nic nie zmienia.
@Goryptic: W przypadku typów prostych tzn. int, float itp, gdy przekazujesz "normalnie" zmienną do metody to na stosie tworzona jest kopia zmiennej i w metodzie operujesz na kopii przez co ta oryginalna zmienna poza tą metodą się nie zmienia. Gdy wstawisz tam ref nie tworzy się kopia, a program operuje na oryginalnej zmiennej przez co wartość zmienia się zarówno w metodzie jak i poza niej.

Sytuacje trochę wygląda inaczej w przypadku