yield (C# Başvurusu)yield (C# Reference)

Bir ifadede yield bağlamsal anahtar sözcüğünü kullandığınızda, görünen yöntemin, işlecin veya get erişimcinin bir yineleyici olduğunu belirtirsiniz.When you use the yield contextual keyword in a statement, you indicate that the method, operator, or get accessor in which it appears is an iterator. Bir yield Yineleyici tanımlamak için kullanmak, özel bir koleksiyon için IEnumerable ve IEnumerator modelini uyguladığınızda açık bir ek sınıfa yönelik gereksinimi kaldırır (bir numaralandırma için durumu IEnumerator<T> tutan sınıf, bir örnek için bkz.) türüyle.Using yield to define an iterator removes the need for an explicit extra class (the class that holds the state for an enumeration, see IEnumerator<T> for an example) when you implement the IEnumerable and IEnumerator pattern for a custom collection type.

Aşağıdaki örnekte, yield ifadesinin iki formu gösterilmektedir.The following example shows the two forms of the yield statement.

yield return <expression>;
yield break;

AçıklamalarRemarks

Her öğeyi birer yield return birer döndürmek için bir ifade kullanırsınız.You use a yield return statement to return each element one at a time.

Bir yineleyici yönteminden döndürülen sıra, foreach IFADESI veya LINQ sorgusu kullanılarak tüketilebilir.The sequence returned from an iterator method can be consumed by using a foreach statement or LINQ query. foreach Döngünün her yinelemesi yineleyici yöntemini çağırır.Each iteration of the foreach loop calls the iterator method. Yineleyici yönteminde yield return bir ifadeye ulaşıldığında, expression döndürülür ve koddaki geçerli konum korunur.When a yield return statement is reached in the iterator method, expression is returned, and the current location in code is retained. Yürütme, yineleyici işlevinin bir sonraki çağrılmasında bu konumdan başlar.Execution is restarted from that location the next time that the iterator function is called.

Yinelemeyi sonlandırmak için bir yield break ifade kullanabilirsiniz.You can use a yield break statement to end the iteration.

Yineleyiciler hakkında daha fazla bilgi için bkz. yineleyiciler.For more information about iterators, see Iterators.

Yineleyici yöntemleri ve get erişimcileriIterator methods and get accessors

Bir yineleyicinin bildirimi aşağıdaki gerekliliklerle uyuşmalıdır:The declaration of an iterator must meet the following requirements:

Veya yield döndürenbirIEnumerable Yineleyici türü .object IEnumeratorThe yield type of an iterator that returns IEnumerable or IEnumerator is object. Yineleyici veya IEnumerable<T> IEnumerator<T>döndürürse, deyimde deyim yield return türünden genel tür parametresine örtük bir dönüştürme olmalıdır.If the iterator returns IEnumerable<T> or IEnumerator<T>, there must be an implicit conversion from the type of the expression in the yield return statement to the generic type parameter .

yield return İçine or yield break ifadesini ekleyemezsiniz:You can't include a yield return or yield break statement in:

Özel durum işlemeException handling

Bir yield return ifade, try-catch bloğunda bulunamaz.A yield return statement can't be located in a try-catch block. Bir yield return ifade, try-finally ifadesinin try bloğunda bulunabilir.A yield return statement can be located in the try block of a try-finally statement.

Bir yield break ifade bir try bloğunda veya catch bloğunda bulunabilir, ancak finally bloğunda yer alabilir.A yield break statement can be located in a try block or a catch block but not a finally block.

Gövde (yineleyici yönteminin dışında) bir özel durum oluşturursa, yineleyici yönteminde bir finally blok yürütülür. foreachIf the foreach body (outside of the iterator method) throws an exception, a finally block in the iterator method is executed.

Teknik uygulamaTechnical implementation

Aşağıdaki kod bir yineleyici yönteminden IEnumerable<string> bir döndürür ve sonra öğeleri boyunca yinelenir.The following code returns an IEnumerable<string> from an iterator method and then iterates through its elements.

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

Çağrısı MyIteratorMethod , yönteminin gövdesini yürütmez.The call to MyIteratorMethod doesn't execute the body of the method. Bunun yerine, çağrı IEnumerable<string> elements değişkenine bir döndürür.Instead the call returns an IEnumerable<string> into the elements variable.

foreach Döngüsünün bir yinelemesinde MoveNext , yöntemi için elementsçağrılır.On an iteration of the foreach loop, the MoveNext method is called for elements. Bu çağrı, sonraki MyIteratorMethod yield return ifadeye ulaşılana kadar gövdesini yürütür.This call executes the body of MyIteratorMethod until the next yield return statement is reached. yield return Deyimi tarafından döndürülen ifade, yalnızca Current döngü gövdesi tarafından tüketim için element değişkenin değerini değil, öğesinin elementsözelliğini de bir IEnumerable<string>olarak belirler.The expression returned by the yield return statement determines not only the value of the element variable for consumption by the loop body but also the Current property of elements, which is an IEnumerable<string>.

foreach Döngünün sonraki tekrarında, yineleyici gövdesinin yürütülmesi kaldığınız yerden devam eder, bir yield return ifadeye ulaştığında yeniden durdurulur.On each subsequent iteration of the foreach loop, the execution of the iterator body continues from where it left off, again stopping when it reaches a yield return statement. Yineleyici yönteminin sonuna veya bir yield break ifadeye ulaşıldığında döngütamamlanır.foreachThe foreach loop completes when the end of the iterator method or a yield break statement is reached.

ÖrnekExample

Aşağıdaki örnekte, for döngüsünün içinde yield return olan bir ifade vardır.The following example has a yield return statement that's inside a for loop. Yöntemi içindeki ifade gövdesinin her yinelemesi Power , Yineleyici işlevine bir çağrı oluşturur. foreach MainEach iteration of the foreach statement body in the Main method creates a call to the Power iterator function. Yineleyici işlevine yapılan her çağrı, yield return for döngüsünün bir sonraki yinelemesi sırasında ortaya çıkan deyimin bir sonraki yürütmeye ilerler.Each call to the iterator function proceeds to the next execution of the yield return statement, which occurs during the next iteration of the for loop.

Yineleyici yönteminin IEnumerabledönüş türü, yineleyici arabirim türü olan.The return type of the iterator method is IEnumerable, which is an iterator interface type. Yineleyici yöntem çağrıldığında, bir sayının kuvvetlerini içeren sayılabilir bir nesne döndürür.When the iterator method is called, it returns an enumerable object that contains the powers of a number.

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.Generic.IEnumerable<int> 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
}

ÖrnekExample

Aşağıdaki örnek, yineleyici olan get bir erişimciyi gösterir.The following example demonstrates a get accessor that is an iterator. Örnekte, her yield return bir ifade Kullanıcı tanımlı bir sınıfın bir örneğini döndürür.In the example, each yield return statement returns an instance of a user-defined class.

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; }
    }
}

C# dili belirtimiC# language specification

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi.For more information, see the C# Language Specification. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.The language specification is the definitive source for C# syntax and usage.

Ayrıca bkz.See also