2010-04-23 12 views
22

Mam niejasne pojęcie słowa kluczowego yield w , 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?

+3

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

+0

Och, dzięki! Mnóstwo przydatnych rzeczy! – Steve

+0

możliwy duplikat http://stackoverflow.com/questions/39476/what-is-the-yield-keyword-used-for-in-c-pl –

Odpowiedz

14

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).

4

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.

+0

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

4

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.

3

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;