C # ma słowa kluczowe out
i ref
. Dlaczego te dwa są wymagane? Oświadczenie: Nie mam głębokiej wiedzy na temat C #.
c#
parameters
keywords
Neo
źródło
źródło
ref
iout
? A może pytasz, jakie jest użycie argumentówref
/ referencjiout
w porównaniu do argumentów według wartości (bez modyfikatora parametru)? Lub oba?Odpowiedzi:
Jeśli chodzi o implementację, są one zasadniczo takie same, ale
out
komunikują coś, czegoref
nie ma: nie przejmujesz się wkładem. Oznacza to pewne rzeczy dla Ciebie i dla narzędzi. Na przykład, możesz przekazać niezainicjowaną zmienną doout
parametru i to nie jest problem, w innym przypadku byłoby to możliwe, aw ramach funkcji musisz przypisać wartość doout
parametru przed jego zwróceniem, podczas gdy nie ma potrzeby robienia czegokolwiek w parametrze wszystko zref
wartością.źródło
out
daje sposób, aby to lepiej pasowało do tego, jak chcesz sobie radzić ze zmiennymi.out
parametru, ponieważ funkcja odbierająca go nie będzie z niego czytać .Aby zrozumieć te dwa słowa kluczowe, musisz zrozumieć, co oznacza przekazanie wartości przez odwołanie . Zasadniczo oznacza to, że jeśli zmodyfikujesz zmienną parametru przekazywaną w ramach metody lub funkcji, zmienna ta zachowuje swoją zmodyfikowaną wartość po wyjściu z funkcji. Zadeklarowanie parametru jako takiego
ref
lubout
dokonanie tego, podczas gdy zwykła zmienna parametru zachowałaby swoją pierwotną wartość, nawet jeśli zmodyfikujesz go w funkcji.Jedyne różnice między
ref
iout
to, żeout
nie wymaga inicjalizacji zmiennej przed przekazaniem jej do funkcji, aleref
wymaga; natomiastout
nie wymaga, aby przypisać coś do zmiennej wewnątrz funkcji, aleref
tego nie robi.źródło
Zapytałeś.
I odpowiedź jest taka, że nie są WYMAGANE, java na przykład nie ma żadnego, a VB ma tylko ref (i wymaga go tylko w deklaracji metody).
Możesz łatwo napisać cały program bez użycia żadnego z nich.
Istnieją, ponieważ czasami są przydatne. Dlatego są ich dwa, a nie tylko jeden - ponieważ warto rozróżnić „tu jest coś, zmodyfikuj go, jeśli chcesz” i „nadaj temu rzeczowi nową wartość”.
Inne języki mają różne priorytety, więc mogą, ale nie muszą, uwzględniać te lub równoważne. Mogą nawet nie zgadzać się co do tego, czy któreś z nich jest przydatne, i dlatego mogą aktywnie decydować o NIE wdrażaniu jednego lub drugiego.
źródło
Zarówno w ich rdzeniu
ref
iout
zapewnić mechanizm przekazywania adresu zmiennej do metody tak, że może być aktualizowana - przypisanie doref
lubout
parametr aktualizuje zmienną w kontekście rozmówcy. Różnią się one gwarancjami:out
gwarancje, że zmienna zostanie zaktualizowana,ref
nie.Z drugiej strony połączenia występują podobne różnice. Nie
out
można zagwarantować, że parametr naszej metody zawiera coś użytecznego po przybyciu i musi być ustawiony na wartość w pewnym momencie, podczas gdyref
można założyć , że parametr ma wartość i nie musimy robić z nią nic konkretnego.Różnica ta ma wpływ na analizę, generowanie i optymalizację kodu, która - choć nie jest nam to przez większość czasu szczególnie widoczna - może mieć wpływ na sposób działania naszych programów. Generator kodu może odroczyć alokację zmiennej do momentu bezpośrednio przed wywołaniem, optymalizator może zdecydować, że może bardziej skutecznie porządkować niektóre operacje na podstawie umowy itp.
Pod względem użytkowania: jako ogólna zasada stosuję
out
w sytuacjach, w których nie dbam o treść zmiennej, gdy pojawia się ona jako parametr iref
kiedy to robię.źródło