Aracılığıyla paylaş


Verim (C# Reference)

Kullandığınızda, yield anahtar sözcüğünü bir deyimde, belirtmek yöntemi, işleci veya get görünür olduğu bir yineleyici erişimci.Bir yineleyici bir koleksiyon üzerinde özel bir yineleme yapmak için kullanın.Aşağıdaki örnek, iki gösterir yield ifadesi.

yield return <expression>;
yield break;

Notlar

Kullandığınız bir yield return her öğe bir defada döndürmek için deyimi.

Bir yineleyici yöntemi kullanarak tüketen bir foreach deyimi veya LINQ sorgusu.Her tekrarında foreach döngüsü, yineleyici yöntemini çağırır.Zaman bir yield return deyimi Yineleyici yönteminde ulaştı expression iade edilir ve kod geçerli konumda korunur.Yürütme Yineleyici işlevi adı verilen bir sonraki açışınızda bu konumdan yeniden başlatılır.

Kullanabileceğiniz bir yield break yinelemeyi sonlandırmak için ifade.

Yineleyicilerde hakkında daha fazla bilgi için bkz: Yineleyicilerde (C# ve Visual Basic).

Yineleyici yöntemleri ve get erişimcileri

Bir yineleyici bildirimi aşağıdaki gereksinimleri karşılaması gerekir:

Bir kapalı dönüştürme ifadesinde tür gelen bulunmalıdır yield return ifadesine Yineleyici dönüş türü.

Dahil edemezsiniz bir yield return veya yield break deyiminde yöntemleri aşağıdaki özelliklere sahiptir:

Özel durum işleme

A yield return deyim bir try-catch bloğu içinde bulunan olamaz.A yield return deyim bir try finally deyimi try bloğunda bulunan.

A yield break ifade bulunan bir try bloðu veya bir catch bloğu içinde değil ama bir finally bloğunda.

foreach Gövde (Yineleyici yöntemi dışında) bir özel durum atar bir finally blok Yineleyici yöntemi çalıştırılır.

Teknik uygulama

Aşağıdaki kod döndürür bir IEnumerable<string> bir yineleyici yönteminden ve sonra kendi öğelerini aracılığıyla sırayla dolaşır.

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

Çağrı MyIteratorMethod yönteminin gövdesini yürütmez.Bunun yerine çağrı döndürür bir IEnumerable<string> içine elements değişkeni.

Bir yineleme foreach döngü, MoveNext yöntemi çağrıldığında için elements.Gövdesi bu çağrıyı yürütür MyIteratorMethod kadar İleri yield return deyimi ulaşıldığında.Deyim tarafından döndürülen yield return ifadesi yalnızca değerini belirler element Değişken tüketim döngüsünün gövdesi olarak da Current özelliği, öğelerin bir IEnumerable<string>.

Her bir sonraki yinelemede foreach döngüsü, yineleyici gövde nereden yürütülmeye ulaştığında yeniden durdurma kapalı, sol bir yield return ifadesi.foreach Döngüsü tamamlandıktan Yineleyici yönteminin sonuna veya bir yield break deyimi ulaşıldığında.

Örnek

Aşağıdaki örnek olan bir yield return deyimi içinde olan bir for döngü.Her tekrarında foreach gövdesi içinde deyim Process bir çağrı oluşturur Power Yineleyici işlevi.Yineleyici işleve yapılan her çağrı geçer Sonraki yürütülmesi için yield return bir sonraki yinelemesini sırasında ortaya çıkan ifade for döngü.

Yineleyici yöntemin dönüş türü IEnumerable, bir yineleyici arabirimi türü değil.Yineleyici yöntemi çağrıldığında, bir sayı kuvvetleri içeren sayılabilir 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.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
}

Aşağıdaki örnekte gösterilmiştir bir get olan bir yineleyici erişimci.Örnekte, her yield return deyimi, 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# dil belirtimi

Daha fazla bilgi için bkz: C# dil belirtiminin. Dil belirtimi, C# sözdizimi ve kullanımı için nihai kaynaktır.

Ayrıca bkz.

Başvuru

foreach, başvurusu (C#)

Kavramlar

C# Programlama Kılavuzu

Diğer Kaynaklar

C# Başvurusu

Yineleyicilerde (C# ve Visual Basic)