SORU
29 Aralık 2008, PAZARTESİ


Nasıl foreach döngüsü C çalışma#?

Hangi tür sınıfları foreach döngüler kullanabilir mi?

CEVAP
29 Aralık 2008, PAZARTESİ


Aslındakesinliklekonuşma, foreach kullanmak için ihtiyaç bool MoveNext() yöntemi ile bir şeyler verir GetEnumerator() genel bir yöntem ve ? Current {get;} bir özelliktir. Ancak, çoğuortakbunun anlamı "IEnumerator/IEnumerator<T>bir dönenIEnumerable/IEnumerable<T>, uygulayan bir şey.

Dolaylı olarak, bu,** *14 *13, diziler (T[]), vb gibi bir şey gibiICollection/ICollection<T>, uygulayan bir şey içerir. Bu yüzden herhangi bir standart "veri toplama" genellikle foreach destek olacak.

İlk noktayı kanıtlamak için, aşağıdaki gayet güzel çalışıyor:

using System;
class Foo {
    public int Current { get; private set; }
    private int step;
    public bool MoveNext() {
        if (step >= 5) return false;
        Current = step  ;
        return true;
    }
}
class Bar {
    public Foo GetEnumerator() { return new Foo(); }
}
static class Program {
    static void Main() {
        Bar bar = new Bar();
        foreach (int item in bar) {
            Console.WriteLine(item);
        }
    }
}

Nasıl çalışır?

foreach(int i in obj) {...} gibi bir foreach döngü biraz eşittir:

var tmp = obj.GetEnumerator();
int i; // up to C# 4.0
while(tmp.MoveNext()) {
    int i; // C# 5.0
    i = tmp.Current;
    {...} // your code
}

Ancak, farklılıklar vardır. Örneğin, numaralandırıcısı (tmp) IDisposable de kullanılır (using benzer) destekler.

Fark unutmayınBeyannamenin yerleştirme "int i"içinde(C# 5.0) vsdışarıda(# 4.0 C) döngü. Kod-blok içinde isimsiz bir yöntem/lambda i kullanıyorsanız önemli. Ama bu başka bir hikaye ;-p

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Brendan van Son

    Brendan van

    5 Aralık 2006
  • USI Events

    USI Events

    6 AĞUSTOS 2013
  • William Sledd

    William Sled

    24 EYLÜL 2006