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...