yield (C# Başvurusu)

Bir deyiminde yieldyield kullanırken, göründüğü yöntemin, işlecin veya get erişimcinin birerator olduğunu belirtebilirsiniz. bir yield tekrarlayıcı tanımlamak için kullanmak, özel bir koleksiyon türü için ve desenini uygulayan açık bir ek sınıf (bir numaralamanın durumunu tutan sınıf, IEnumerator<T> örneğin bkz. ) IEnumerableIEnumerator gereklerini ortadan kaldırır.

Aşağıdaki örnekte deyiminin iki formu gösterir yield .

yield return <expression>;
yield break;

Açıklamalar

Her öğeyi tek yield return tek geri dönmek için deyimini kullanırsiniz.

Bir tekrarlayıcı yönteminden döndürülen sıra bir foreach deyimi veya LINQ sorgusu kullanılarak tüketilebilir. Döngülerin her yinelemesi foreach , yineleme yöntemini çağrılır. yield return Bir deyimine tekrarlayıcı yönteminde ulaşıldı, expression döndürülür ve kodda geçerli konum korunur. Yürütme, yineleyici işlevinin bir sonraki çağrılmasında bu konumdan başlar.

Tekrarlayıcı bir döndürünce System.Collections.Generic.IAsyncEnumerable<T>, bu sıra bir System.Collections.Generic.IAsyncEnumerable<T> deyimi kullanılarak zaman uyumsuz olarak tüketilebilir. Döngü yinelemesi deyimine benzer foreach . Aradaki fark, bir sonraki öğe için ifadeyi döndürmeden önce her yinelemenin zaman uyumsuz bir işlem için askıya alınarak askıya alınabilir olmasıdır.

Yinelemeyi sona erdiren yield break bir deyimi kullanabilirsiniz.

Tekrarlayıcılar hakkında daha fazla bilgi için bkz. Tekrarlayıcılar.

Iterator yöntemleri ve erişimcileri al

Bir yineleyicinin bildirimi aşağıdaki gerekliliklerle uyuşmalıdır:

veya yield döndüren bir tekrarlayıcının IEnumerable türüIEnumerator.object Tekrarlayıcı veya döndürürse IEnumerable<T>IEnumerator<T>, deyiminde ifadenin türünden genel tür parametresine örtülü yield return bir dönüştürme olmalıdır.

Bir veya deyimini şu özelliklere yield return dahil yield break etmek için:

Özel durum işleme

deyimi yield return bir try-catch bloğunda yer alamz. Deyimi yield return , try-finally deyiminin try bloğunda yer alıyor olabilir.

Deyimi yield break bir try bloğunda veya yakalama bloğunda yer alıyor olabilir, ancak finally bloğunda yer alamz.

veya gövdesi foreachawait foreach (iterator yönteminin dışında) bir özel durum oluşturursa, finally iterator yönteminde bir blok yürütülür.

Teknik uygulama

Aşağıdaki kod bir yineleyici IEnumerable<string> yönteminden bir döndürür ve ardından öğelerinde yineler.

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

çağrısı MyIteratorMethod yönteminin gövdesinde yürütmez. Bunun yerine çağrısı değişkenine IEnumerable<string> bir elements döndürür.

Döngü yinelemesinde foreach yöntemi MoveNext için çağrılır elements. Bu çağrı, bir sonraki deyime MyIteratorMethod ulaşıncaya kadar yield return gövdeyi yürütür. deyimi tarafından döndürülen ifade yield return yalnızca döngü gövdesi elementselementCurrent tarafından tüketilmek üzere değişkenin değerini değil, aynı zamanda bir olan özelliğini de belirler.IEnumerable<string>

Döngüyü izleyen her yinelemede foreach yineleyici gövdesinin yürütülmesi, deyimine ulaştığında tekrar durdurularak geriye doğru devam yield return eder. Döngü foreach , tekrarlayıcı yönteminin veya deyiminin sonuna ulaşıldıklarda yield break tamamlanır.

Aşağıdaki kod bir yineleyici IAsyncEnumerable<string> yönteminden bir döndürür ve ardından öğelerinde yineler.

IAsyncEnumerable<string> elements = MyAsyncIteratorMethod();
await foreach (string element in elements)
{
   // ...
}

Döngü yinelemesinde await foreach yöntemi IAsyncEnumerator<T>.MoveNextAsync için çağrılır elements. ile System.Threading.Tasks.ValueTask<TResult> dönüş, MoveNext bir sonrakine ulaşıldıklarda yield return tamamlanır.

Döngüyü izleyen her yinelemede await foreach yineleyici gövdesinin yürütülmesi, deyimine ulaştığında tekrar durdurularak geriye doğru devam yield return eder. Döngü await foreach , tekrarlayıcı yönteminin veya deyiminin sonuna ulaşıldıklarda yield break tamamlanır.

Örnekler

Aşağıdaki örnekte döngü içinde yield return yer alan bir deyimi for vardır. yönteminde deyim foreach gövdesinin her yinelemesi Main , tekrarlayıcı işlevine Power bir çağrı oluşturur. Yineleme işlevine yapılan her çağrı, döngüyü yield return bir sonraki yinelemesinde olan deyiminin sonraki yürütme işlemine devam for eder.

Bir tekrarlayıcı arabirim türü olan, tekrarlayıcı IEnumerableyönteminin dönüş türü olur. Yineleyici yöntem çağrıldığında, bir sayının kuvvetlerini içeren sayılabilir bir nesne döndürür.

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
}

Aşağıdaki örnek, bir iterator get olan bir erişimciyi gösteriyor. Örnekte, her deyim yield return kullanıcı tanımlı bir sınıfın örneğini döndürür.

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 belirtimi

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.

Ayrıca bkz.