SORU
7 Kasım 2008, Cuma


C bir döngü içinde yakalanan değişken#

C ile ilgili ilginç bir sorunla karşılaştım#. Aşağıdaki gibi bir kod var.

List<Func<int>> actions = new List<Func<int>>();

int variable = 0;
while (variable < 5)
{
    actions.Add(() => variable * 2);
       variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}

Çıkış 0, 2, 4, 6, 8 onu bekliyorum. Ancak, aslında beş 10lu çıkışlar.

Tüm eylemler bir esir değişken atıfta nedeniyle gibi görünüyor. Çağrılan geldiklerinde, sonuç olarak, hepsi aynı çıktı.

Bir şekilde yuvarlak bu sınır her eylem bir örneği ele değişkeni var çalışmam gerek var mı?

CEVAP
7 Kasım 2008, Cuma


- Döngü içinde değişken bir kopyasını almak Evet:

while (variable < 5)
{
    int copy = variable;
    actions.Add(() => copy * 2);
       variable;
}

C gibi düşünebilirsiniz# oluşturur derleyici bir "yeni" yerel değişken bildirimi vurur her zaman. Aslında uygun yeni kapatma nesneleri oluşturmak ve karmaşık (uygulama açısından) eğer birden çok kapsam değişkenleri başvurursanız, çalışıyor ama :) olur

Bu sorun daha sık karşılaşılan bir durumdur for foreach kullandığı not:

for (int i=0; i < 10; i  ) // Just one variable
foreach (string x in foo) // And again, despite how it reads out loud

C bölümü 7.14.4.2 bu daha fazla ayrıntı için# 3.0 spec, ve benim article on closures Daha fazla örnek de var.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • GoldgenieOfficial

    GoldgenieOff

    23 Temmuz 2009
  • LatinNinja99

    LatinNinja99

    28 EKİM 2011