C # oferuje ref
i out
słów kluczowych, aby argumenty mają być przekazywane przez referencję. Semantyka tych dwóch jest bardzo podobna. Jedyną różnicą jest inicjalizacja zmiennej flaged:
ref
wymaga zainicjowania zmiennej przed przekazaniem jej do funkcji,out
nie.out
wymaga inicjalizacji zmiennej wewnątrz funkcji,ref
nie wymaga.
Przypadki użycia tych dwóch słów kluczowych są również prawie takie same, a ich zbyt częste użycie uważam za zapach kodu (chociaż istnieją prawidłowe przypadki użycia, takie jak TryParse
i TryGetValue
wzorce).
Z tego powodu ktoś mógłby wyjaśnić, dlaczego istnieją dwa bardzo podobne narzędzia w języku C # dla tak wąskich przypadków użycia?
Ponadto w witrynie MSDN stwierdzono, że mają one różne zachowanie w czasie wykonywania:
Chociaż słowa kluczowe ref i out powodują różne zachowanie w czasie wykonywania, nie są one uważane za część podpisu metody w czasie kompilacji.
Czym różni się ich zachowanie w czasie wykonywania?
Wniosek
Obie odpowiedzi wyglądają poprawnie, dziękuję wam obojgu. Zaakceptowałem jmoreno , ponieważ jest bardziej jednoznaczne.
ref
w C ++; do wskaźników do wskazanego wskaźnika obiektu (lub prymitywu). tj.Int32.TryParse(myStr, out myInt)
(C #) jest „wykonywany” w taki sam sposób, jakint32_tryParse(myStr, &myInt)
zrobiłby to (C); jedyną różnicą są pewne ograniczenia narzucone przez kompilator w celu zapobiegania błędom. (Nie opublikuję tego jako odpowiedzi, ponieważ mogę się mylić co do tego, jak to działa za kulisami, ale tak sobie wyobrażam, że to działa [ponieważ ma to sens])