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

  • SavageLuxxxGaming - Daily NBA 2K15 & NBA Live 15 Enjoy And Subscribe!

    SavageLuxxxG

    11 Ocak 2013
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006
  • sghaff1

    sghaff1

    23 Mart 2009