Nasıl foreach döngüsü C çalışma#?
Hangi tür sınıfları foreach döngüler kullanabilir mi?
CEVAP
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

Nasıl vim "sudo" hile çalışm...
Nasıl bir foreach döngünün o anki adım...
Nasıl Gıt bir çalışma dizini içine boş...
Nasıl UTF-8 Java web uygulamalarını ça...
Nasıl geçerli kabuk İ'm çalışma b...