C # ma słowa kluczowe out
i ref
. Dlaczego te dwa są wymagane? Oświadczenie: Nie mam głębokiej wiedzy na temat C #.
źródło
C # ma słowa kluczowe out
i ref
. Dlaczego te dwa są wymagane? Oświadczenie: Nie mam głębokiej wiedzy na temat C #.
Jeśli chodzi o implementację, są one zasadniczo takie same, ale out
komunikują coś, czego ref
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ą do out
parametru i to nie jest problem, w innym przypadku byłoby to możliwe, aw ramach funkcji musisz przypisać wartość do out
parametru przed jego zwróceniem, podczas gdy nie ma potrzeby robienia czegokolwiek w parametrze wszystko z ref
wartością.
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
lub out
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
i out
to, że out
nie wymaga inicjalizacji zmiennej przed przekazaniem jej do funkcji, ale ref
wymaga; natomiast out
nie wymaga, aby przypisać coś do zmiennej wewnątrz funkcji, ale ref
tego nie robi.
Zapytałeś.
C # ma obecnie i ref, dlaczego te dwa są wymagane. Nie mam głębokiej wiedzy na temat C #. Dlaczego wymagane są parametry out i ref?
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.
Zarówno w ich rdzeniu ref
i out
zapewnić mechanizm przekazywania adresu zmiennej do metody tak, że może być aktualizowana - przypisanie do ref
lub out
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 gdy ref
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 i ref
kiedy to robię.
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?