2011-11-21 12 views
9

Właściwie robię listę jako parametr odniesienia następująco:Najlepsza praktyka: parametr referencyjny lub wartość zwracana?

public static List ListMethod(List result) 

Widziałem niektórzy ludzie robią w ten sposób zbyt:

public static void ListMethod(ref List result) 

Jeśli się nie mylę, „moja” metoda również przyjmuje parametr list jako parametr referencyjny i powinieneś być w stanie go używać w taki sam sposób, jak w jego metodzie "inny".

Ale wydaje mi się bardziej "czysty", że wprowadzasz parametr, robisz coś z nim i zwracasz go w metodach zwracających wartość.

Jakieś dobre argumenty za lub przeciw jednej lub drugiej metodzie?

+0

To jest lista? po co wysyłasz przez referencję to, co próbujesz osiągnąć? –

+3

Bez przekazywania jako ref/out, wewnętrznie odwołanie wskazujące na kopie sterty jest wykonane w stosie i jest przekazywane do metody wywoływanej. Jeśli użyto ref, to samo odniesienie jest używane jako przekazywany argument. – Zenwalker

+1

Dlaczego uważasz, że powinieneś zwrócić 'List' w swojej pierwszej metodzie i nie zwracać niczego w drugiej? – BoltClock

Odpowiedz

30

To prawdopodobne że nie trzeba używać ref - ale jest różnica.

Zwykle, gdy widzę, że ludzie używają ref dla parametrów typu referencyjnego, dzieje się tak dlatego, że nie rozumieją, jak działa przekazywanie parametrów. Ale jeśli metoda ma coś takiego:

result = new List(); 
... 

czym w pierwszym przypadku rozmówca nie będzie widać zmiany, natomiast w drugim przypadku zmienna rozmówcy zostanie zmieniony w odniesieniu do nowego obiektu.

Zobacz mój article on parameter passing, aby uzyskać o wiele więcej szczegółów.

+0

Dzięki 'Jon Skeet' – Dotnet

3

Jeśli właśnie zwracasz listę, powinieneś zawsze używać pierwszej, ponieważ pokazuje ona intencję.

Wersja z ref mówi mi, że mogę zacząć od listy, a twoja metoda zmodyfikuje listę, którą wysłałem, lub nawet zmieni ją na inną. Jeśli to jest twoja intencja, zrób to.

Ale jeśli metoda allways zwraca nową listę, użyj wartości zwracanej zamiast parametru ref.

Uwaga na stronie: można użyć out zamiast ref aby pokazać swoje intencje powrocie nową listę, ale to jest tylko dobra praktyka, jeśli używasz wartości zwracanej przez coś innego.

11

Nie, twoja metoda nie używa parametru ref. Wartość domyślna to pass by value.

Różnica polega na tym, że twoja metoda może po prostu zmodyfikować zawartość listy, ale nie wskazuje na odniesienie parametru result.

Jakie jest najlepsze podejście? To zależy od tego, co powinna zrobić twoja metoda.

Gdy twoja metoda modyfikuje listę lub zwraca nowe dane, powinieneś użyć wartości zwracanej. Znacznie lepiej zrozumieć, co robi twój kod, niż używając parametru ref.

Inną zaletą zwracanych wartości jest możliwość użycia metody łańcuchowania.

można napisać kod jak ten, który przechodzi parametr listy Z jednej metody na drugą:

ListMethod1(list).ListMethod2(list)... 
+3

+1 za umiejętność wykonywania łańcuchów metod. Możesz nawet to zrobić * i * zmodyfikować parametr, jeśli naprawdę chcesz; "wynik zwrotu" nie jest zbyt drogi pod względem LOC, procesora lub złożoności i może znacznie ułatwić życie konsumentowi funkcji. –

1

Jedno specjalny o sygn parametru tutaj jest to, że - „Zmienna przekazywana z dopiskiem musi najpierw zostać przypisana wartość. ". Jeśli więc chcesz, aby było to ścisłe dla metody wywołującej, aby przypisać wartość przed wywołaniem, prawdopodobnie możesz użyć parametru Parametry.