Mam niejasne pojęcie słowa kluczowego yield
w c#, ale jeszcze nie widziałem potrzeby korzystania z niego w moim kodzie. Prawdopodobnie wynika to z braku zrozumienia.Używanie wydajności w języku C#
Jakie są więc typowe dobre zastosowania z yield
?
Mam niejasne pojęcie słowa kluczowego yield
w c#, ale jeszcze nie widziałem potrzeby korzystania z niego w moim kodzie. Prawdopodobnie wynika to z braku zrozumienia.Używanie wydajności w języku C#
Jakie są więc typowe dobre zastosowania z yield
?
yield
po prostu bardzo ułatwia wdrożenie modułu wyliczającego. Jeśli więc chcesz zapisać metodę, która zwróci wartość IEnumerable<T>
, to zaoszczędzisz konieczności utworzenia klasy modułu wyliczającego - tylko jeden wynik na raz, a kompilator zajmie się szczegółami pod okładkami.
Jednym przydatnym przypadkiem jest napisanie "nieskończonego modułu wyliczającego", który wywoływacz może wywoływać tyle razy, ile potrzebuje. Oto przykład, który generuje nieskończoną serię liczb Fibonacciego: http://chrisfulstow.com/fibonacci-numbers-iterator-with-csharp-yield-statements/ (cóż ... teoretycznie nieskończona, ale w praktyce ograniczona do rozmiaru UInt64).
Wydajność realizuje wzór leniwego ładowania. Proponuję rozważyć jego użyteczność z tej perspektywy.
Na przykład. w kontekście oprogramowania biznesowego, nad którym pracuję, może przynieść korzyści obniżenia obciążenia bazy danych. Piszesz kod, który pobiera różne dane z bazy danych, ale tylko ta część zostanie załadowana, co jest naprawdę potrzebne dla konkretnego scenariusza. Jeśli użytkownik nie przejdzie głębiej w interfejsie użytkownika, odpowiednie dane nie zostaną załadowane.
To był naprawdę przydatny przykład, który pokazuje, że masz długą listę, która może nie być w pełni wykorzystana. – maulik13
Wydajność jest używana w modułach wyliczających. Kompilator C# automatycznie przerywa wykonywanie pętli wyliczeniowej i zwraca bieżącą wartość do wywołującego.
IEnumerable<int> GetIntegers(int max) {
for(int i = 1; i <= max) {
yield return i; // Return current value to the caller
}
}
- lub (bardziej niezgrabne) -
IEnumerable<int> GetIntegers(int max) {
int count = 0;
while(true) {
if(count >= max) yield break; // Terminate enumeration
count++;
yield return count; // Return current value to the caller
}
}
Więcej szczegółów na MSDN.
także całkiem dobrze w testach i szyderczy, gdy po prostu chcesz przetestować IEnumerable <> szybko coś takiego ...
yield return somevalue;
yield return someothervalue;
yield return yetanotherone;
Spróbuj najpierw: http://stackoverflow.com/search?q= yield + c% 23, pierwsza strona wyników zawiera co najmniej 5 pytań, które powinny ci pomóc. – Benjol
Och, dzięki! Mnóstwo przydatnych rzeczy! – Steve
możliwy duplikat http://stackoverflow.com/questions/39476/what-is-the-yield-keyword-used-for-in-c-pl –