Przeczytałem wersję tego pytania w C ++, ale tak naprawdę jej nie rozumiałem.
Czy ktoś może jasno wyjaśnić, czy można to zrobić i jak?
Przeczytałem wersję tego pytania w C ++, ale tak naprawdę jej nie rozumiałem.
Czy ktoś może jasno wyjaśnić, czy można to zrobić i jak?
W C # 7 i powyżej zobacz tę odpowiedź .
W poprzednich wersjach można używać Tuple .NET 4.0 + :
Na przykład:
public Tuple<int, int> GetMultipleValue()
{
return Tuple.Create(1,2);
}
Krotki z dwiema wartościami mają Item1
i Item2
jako właściwości.
public (int sum, int count) GetMultipleValues() { return (1, 2); }
Ten przykład został zaczerpnięty z naszego przykładu tematu Dokumentacja na ten temat .Teraz, gdy C # 7 zostało wydane, możesz używać nowej dołączonej składni Tuples
które można następnie wykorzystać w następujący sposób:
Możesz także nadać nazwy swoim elementom (więc nie są to „Item1”, „Item2” itp.). Możesz to zrobić, dodając nazwę do podpisu lub metody zwrotu:
lub
Można je również zdekonstruować, co jest całkiem fajną nową funkcją:
Sprawdź ten link, aby zobaczyć więcej przykładów tego, co można zrobić :)
źródło
Możesz użyć trzech różnych sposobów
1. parametry ref / out
przy użyciu ref:
używając:
2. struct / class
przy użyciu struct:
za pomocą klasy:
3. Tuple
Klasa Tuple
C # 7 krotek
źródło
Nie możesz tego zrobić w C #. Możesz mieć
Korzystanie z parametru Używanie niestandardowej klasy (lub struktury)out
parametr lub zwrócić własną klasę (lub struct, jeśli chcesz, aby była niezmienna).źródło
async
metod.Tuple
jest droga. (Używam jednakout
parametrów w operacjach synchronicznych; w takich przypadkach są one rzeczywiście przydatne.)Jeśli masz na myśli zwracanie wielu wartości, możesz albo zwrócić klasę / strukturę zawierającą wartości, które chcesz zwrócić, albo użyć słowa kluczowego „out” w parametrach, na przykład:
źródło
Poprzedni plakat ma rację. Nie można zwrócić wielu wartości z metody C #. Masz jednak kilka opcji:
Tutaj zalety i wady są często trudne do zrozumienia. Jeśli zwracasz strukturę, upewnij się, że jest mała, ponieważ struktury są typu wartości i są przekazywane na stos. Jeśli zwracasz instancję klasy, możesz tutaj zastosować pewne wzorce projektowe, aby uniknąć problemów - członkowie klas mogą być modyfikowani, ponieważ C # przekazuje obiekty przez referencję (nie masz ByVal jak w VB ).
Wreszcie możesz użyć parametrów wyjściowych, ale ograniczyłbym użycie tego do scenariuszy, gdy masz tylko kilka (jak 3 lub mniej) parametrów - w przeciwnym razie rzeczy stają się brzydkie i trudne do utrzymania. Ponadto użycie parametrów wyjściowych może hamować sprawność, ponieważ sygnatura metody będzie musiała się zmieniać za każdym razem, gdy trzeba będzie coś dodać do wartości zwracanej, a zwracając instancję struktury lub klasy można dodawać elementy bez modyfikowania sygnatury metody.
Z architektonicznego punktu widzenia odradzałbym używanie par klucz-wartość lub słowników. Uważam, że ten styl kodowania wymaga „tajnej wiedzy” w kodzie używającym metody. Musi z góry wiedzieć, jakie będą klucze i co oznaczają wartości, a jeśli programista pracujący nad wewnętrzną implementacją zmieni sposób tworzenia słownika lub KVP, może łatwo stworzyć kaskadę awarii w całej aplikacji.
źródło
Exception
jeśli druga wartość, którą chcesz zwrócić, jest rozłączna od pierwszej: na przykład, gdy chcesz zwrócić albo wartość udaną, albo rodzaj wartości nieudanej.Albo zwraca instancję klasy lub skorzystać z parametrów. Oto przykład naszych parametrów:
Nazwij to tak:
źródło
Jest wiele sposobów; ale jeśli nie chcesz tworzyć nowego obiektu lub struktury lub czegoś takiego, możesz to zrobić jak poniżej po C # 7.0 :
źródło
W C # 7 dostępna jest nowa
Tuple
składnia:Możesz zwrócić to jako zapis:
Możesz także użyć nowej składni dekonstruktora:
Uważaj jednak na serializację, wszystko to jest cukier składniowy - w faktycznie skompilowanym kodzie będzie to
Tuple<string, int>
(zgodnie z przyjętą odpowiedzią ) ziItem1
orazItem2
zamiastfoo
ibar
. Oznacza to, że serializacja (lub deserializacja) użyje zamiast tego tych nazw właściwości.W celu serializacji zadeklaruj klasę rekordów i zwróć ją.
Nowością w C # 7 jest ulepszona składnia
out
parametrów. Możesz teraz zadeklarowaćout
wstawienie, które lepiej pasuje w niektórych kontekstach:Jednak przeważnie będziesz tego używał we własnych bibliotekach .NET, a nie we własnych funkcjach.
źródło
Inne odpowiedzi podano przy użyciu Tuple, które również poleciłbym, ale przy użyciu nowej funkcji wprowadzonej w C # 7.0.
Więcej informacji można znaleźć tutaj .
źródło
Można to zrobić na kilka sposobów. Możesz użyć
ref
parametrów:To przekazuje odwołanie do funkcji, umożliwiając w ten sposób modyfikacji obiektu na stosie kodu wywołującego. Chociaż technicznie nie jest to wartość „zwrócona”, jest to sposób, aby funkcja zrobiła coś podobnego. W powyższym kodzie funkcja zwróci
int
i (potencjalnie) zmodyfikujebar
.Innym podobnym podejściem jest użycie
out
parametru.out
Parametr jest identyczny zref
parametrem z dodatkowym, kompilator egzekwowane reguły. Ta zasada mówi, że jeśli przekażeszout
parametr do funkcji, funkcja ta musi ustawić swoją wartość przed zwróceniem. Oprócz tej regułyout
parametr działa tak jakref
parametr.Ostatnim podejściem (i najlepszym w większości przypadków) jest stworzenie typu, który zawiera obie wartości i pozwala funkcji zwrócić:
To końcowe podejście jest prostsze i łatwiejsze do odczytania i zrozumienia.
źródło
Nie, nie można zwrócić wielu wartości z funkcji w C # (dla wersji niższych niż C # 7), przynajmniej nie w sposób, w jaki można to zrobić w Pythonie.
Istnieje jednak kilka alternatyw:
Możesz zwrócić tablicę obiektu typu z wieloma wartościami, które chcesz w nim umieścić.
Możesz użyć
out
parametrów.źródło
W C # 4 będziesz mógł użyć wbudowanej obsługi krotek, aby łatwo sobie z tym poradzić.
W międzyczasie istnieją dwie opcje.
Po pierwsze, możesz użyć parametrów ref lub out, aby przypisać wartości do parametrów, które są przekazywane z powrotem do procedury wywołującej.
To wygląda jak:
Po drugie, możesz zawijać zwracane wartości do struktury lub klasy i przekazywać je z powrotem jako członków tej struktury. KeyValuePair działa dobrze dla 2 - dla więcej niż 2 potrzebujesz niestandardowej klasy lub struktury.
źródło
możesz wypróbować ten „KeyValuePair”
Wynik :
Wyjście: 1, 2
źródło
Klasy, struktury, kolekcje i tablice mogą zawierać wiele wartości. Parametry wyjściowe i odniesienia można również ustawić w funkcji. Zwracanie wielu wartości jest możliwe w językach dynamicznych i funkcjonalnych za pomocą krotek, ale nie w języku C #.
źródło
Istnieją głównie dwie metody. 1. Użyj parametrów out / ref 2. Zwróć tablicę obiektów
źródło
Oto podstawowe
Two
metody:1) Użycie „
out
” jako parametru Możesz użyć „out” zarówno dla wersji 4.0, jak i mniejszych.Przykład „out”:
Wynik:
Obszar prostokąta wynosi 20
Obwód prostokąta wynosi 18
* Uwaga: *
out
Słowo-klucz opisuje parametry, których rzeczywiste lokalizacje zmiennych są kopiowane na stos wywoływanej metody, gdzie te same lokalizacje można przepisać. Oznacza to, że metoda wywołująca uzyska dostęp do zmienionego parametru.2)
Tuple<T>
Przykład krotki:
Zwracanie wielu wartości DataType za pomocą
Tuple<T>
Wynik
UWAGA: Użycie Tuple jest ważne od Framework 4.0 i nowszych .
Tuple
typ toclass
. Zostanie przydzielony w oddzielnej lokalizacji na zarządzanej stercie w pamięci. Po utworzeniuTuple
nie można zmienić jego wartościfields
. To sprawia, żeTuple
bardziej przypominastruct
.źródło
Możesz otrzymać kod jak
Mam nadzieję, że to zadziała.
źródło
Metoda przyjmująca delegata może dostarczyć rozmówcy wiele wartości. To zapożycza z mojej odpowiedzi tutaj i wykorzystuje trochę z zaakceptowanej odpowiedzi Hadasa .
Dzwoniący udostępniają lambda (lub nazwaną funkcję), a intellisense pomaga, kopiując nazwy zmiennych z delegata.
źródło
Po prostu użyj w sposób OOP takiej klasy:
Członek funkcji zwraca iloraz, którym najbardziej interesuje większość dzwoniących. Dodatkowo przechowuje resztę jako element danych, do którego później dzwoniący może łatwo uzyskać dostęp.
W ten sposób możesz uzyskać wiele dodatkowych „wartości zwracanych”, bardzo przydatne, jeśli wykonujesz połączenia z bazą danych lub sieciami, gdzie może być potrzebnych wiele komunikatów o błędach, ale tylko w przypadku wystąpienia błędu.
Podałem to rozwiązanie również w pytaniu C ++, do którego odnosi się OP.
źródło
W tym artykule możesz użyć trzech opcji, jak wspomniano powyżej.
KeyValuePair to najszybszy sposób.
obecnie jest na drugim.
Tuple jest najwolniejszy.
W każdym razie zależy to od tego, co jest najlepsze dla twojego scenariusza.
źródło
Przyszła wersja C # będzie zawierać nazwane krotki. Obejrzyj sesję channel9 dla wersji demo https://channel9.msdn.com/Events/Build/2016/B889
Przejdź do 13:00 po krotkę. Pozwoli to na takie rzeczy jak:
(niekompletny przykład z filmu)
źródło
Możesz użyć obiektu dynamicznego. Myślę, że ma lepszą czytelność niż Tuple.
źródło
Sposoby na to:
1) KeyValuePair (najlepsza wydajność - 0,32 ns):
2) Krotka - 5,40 ns:
3) out (1.64 ns) lub ref 4) Stwórz własną klasę / strukturę
ns -> nanosekundy
Odniesienie: wielokrotne wartości zwrotne .
źródło
możesz tego spróbować
źródło
yield return "value1"; yield return "value2";
aby nie musieć jawnie tworzyć nowegostring[]
?Możesz także użyć OperationResult
źródło
Szybka odpowiedź specjalnie dla typów tablicowych zwraca:
Za pomocą:
źródło