Udostępnij za pośrednictwem


wydajność (C# odniesienia)

Podczas korzystania z yield słowa kluczowego w oświadczeniu, możesz wskazać, że metoda, operator, lub get akcesora, w których występuje jest iterację.Iterację służy do wykonywania niestandardowych iteracji w kolekcji.W poniższym przykładzie przedstawiono dwa rodzaje yield instrukcji.

yield return <expression>;
yield break;

Uwagi

Możesz użyć yield return instrukcja zwraca każdy element, jeden na raz.

Zużywają metodę sterująca za pomocą foreach instrukcji lub zapytanie LINQ.Każda iteracja foreach pętli wywołuje metodę sterująca.Gdy yield return instrukcja zostanie osiągnięty w metodzie sterująca expression jest zwracana i bieżącej lokalizacji w kodzie jest zachowywana.Wykonanie jest uruchamiany ponownie z tej lokalizacji w następnym razem, która jest wywoływana funkcja sterująca.

Można użyć yield break instrukcję, aby zakończyć iterację.

Aby uzyskać więcej informacji na temat Iteratory, zobacz Iteratory (C# i Visual Basic).

Metody sterująca i get akcesorów

Deklaracja iteratora muszą spełniać następujące wymagania:

Niejawna konwersja musi istnieć od rodzaju wyrażenie w yield return instrukcję, aby zwracany typ sterująca.

Nie można zawrzeć yield return lub yield break instrukcji w metodach, które mają następujące cechy:

Obsługa wyjątków

A yield return instrukcja nie może znajdować się w bloku try-catch.A yield return instrukcji może znajdować się w bloku try, instrukcja try-finally.

A yield break instrukcji może znajdować się w bloku try lub blok catch, ale nie bloku finally.

Jeśli foreach ciała (poza metodą sterująca) zgłasza wyjątek, finally wykonaniu bloku w metodzie sterująca.

Techniczna realizacja

Następujący kod dodaje zwraca IEnumerable<string> z metody sterująca i następnie iterację jego elementów.

IEnumerable<string> elements = MyIteratorMethod();
foreach (string element in elements)
{
   …
}

Wywołanie MyIteratorMethod nie jest wykonywana treść metody.Zamiast tego wywołanie zwraca IEnumerable<string> do elements zmiennej.

Na powtórzenie foreach pętli, MoveNext dla wywoływana jest metoda elements.To wywołanie wykonuje treści MyIteratorMethod aż do następnego yield return instrukcja zostanie osiągnięty.Wyrażenie zwracane przez yield return Instrukcja określa nie tylko wartość element zmiennej do spożycia przez organ pętli, ale również Current właściwości elementów, która jest IEnumerable<string>.

Przy poszczególnych iteracjach kolejnych foreach w pętli, kontynuuje wykonywanie ciała sterująca z, w którym zostało przerwane, zatrzymując się ponownie po osiągnięciu yield return instrukcji.foreach Pętla kończy, gdy końca metody sterująca lub yield break instrukcja zostanie osiągnięty.

Przykład

Poniższy przykład ma yield return instrukcji, która znajduje się wewnątrz for pętli.Każda iteracja foreach treść instrukcji w Process tworzy wywołanie Power funkcja sterująca.Każde wywołanie funkcji sterująca przechodzi do następnej wykonanie yield return instrukcję, która pojawia się podczas następnej iteracji for pętli.

Zwracany typ metody iteratora jest IEnumerable, który jest typem interfejsu sterująca.Gdy wywoływana jest metoda sterująca, zwraca agreguje ustalony obiekt, który zawiera uprawnień liczby.

public class PowersOf2
{
    static void Main()
    {
        // Display powers of 2 up to the exponent of 8:
        foreach (int i in Power(2, 8))
        {
            Console.Write("{0} ", i);
        }
    }

    public static System.Collections.IEnumerable Power(int number, int exponent)
    {
        int result = 1;

        for (int i = 0; i < exponent; i++)
        {
            result = result * number;
            yield return result;
        }
    }

    // Output: 2 4 8 16 32 64 128 256
}

W poniższym przykładzie zademonstrowano get akcesora, który jest iterację.W przykładzie każda yield return instrukcja zwróci instancję klasy zdefiniowanej przez użytkownika.

public static class GalaxyClass
{
    public static void ShowGalaxies()
    {
        var theGalaxies = new Galaxies();
        foreach (Galaxy theGalaxy in theGalaxies.NextGalaxy)
        {
            Debug.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears.ToString());
        }
    }

    public class Galaxies
    {

        public System.Collections.Generic.IEnumerable<Galaxy> NextGalaxy
        {
            get
            {
                yield return new Galaxy { Name = "Tadpole", MegaLightYears = 400 };
                yield return new Galaxy { Name = "Pinwheel", MegaLightYears = 25 };
                yield return new Galaxy { Name = "Milky Way", MegaLightYears = 0 };
                yield return new Galaxy { Name = "Andromeda", MegaLightYears = 3 };
            }
        }

    }

    public class Galaxy
    {
        public String Name { get; set; }
        public int MegaLightYears { get; set; }
    }
}

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka to najlepsze źródło informacji dotyczących składni i zastosowania języka C#.

Zobacz też

Informacje

foreach w (C# odniesienia)

Koncepcje

Podręcznik programowania C#

Inne zasoby

C# odniesienia

Iteratory (C# i Visual Basic)