Aşağıdaki programda, DummyMethod her zaman yazdırır 5. Ancak, yorumlanan kodu kullanırsak, farklı değerler alırız (yani 1, 2, 3, 4). Herkes bunun neden olduğunu açıklayabilir mi?C# delikleri ile sorun #
delegate int Methodx(object obj);
static int DummyMethod(int i)
{
Console.WriteLine("In DummyMethod method i = " + i);
return i + 10;
}
static void Main(string[] args)
{
List<Methodx> methods = new List<Methodx>();
for (int i = 0; i < 5; ++i)
{
methods.Add(delegate(object obj) { return DummyMethod(i); });
}
//methods.Add(delegate(object obj) { return DummyMethod(1); });
//methods.Add(delegate(object obj) { return DummyMethod(2); });
//methods.Add(delegate(object obj) { return DummyMethod(3); });
//methods.Add(delegate(object obj) { return DummyMethod(4); });
foreach (var method in methods)
{
int c = method(null);
Console.WriteLine("In main method c = " + c);
}
}
Ayrıca aşağıdaki kod kullanılırsa, istenen sonucu alırım.
for (int i = 0; i < 5; ++i)
{
int j = i;
methods.Add(delegate(object obj) { return DummyMethod(j); });
}
Bu soruyu favorilere ekleyin. Bu tür davranışlar sadece "tehlikeli" hisseder. Bahse girerim C# gibi daha da zor hatalardan biri olarak daha sık ortaya çıkacak. Bu, anahtar cümlelerin döngüsel eşdeğerinin, zorunlu "kesinti" olmaksızın aşağı doğru kademeli olarak hareket etmesine izin verilmesi gibidir. cümlesi –
@Neil: Kabul ediyorum, bu bir gotcha-hotspot. "Foreach" ile görüldüğünde daha kafa karıştırıcı oluyor - öyle ki C# takımı bu olayın davranışını değiştirmeyi düşünüyor. (Foreach davranışının arzu edilen bir senaryo olduğunu düşünmek zordur; değişken için sadece bir kez bildirilmiş olduğu için döngü durumu daha anlaşılırdır.) –
[C# Yakalanan Değişken Döngüde] olası bir kopyası (http: //stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop) – nawfal