Önceden özür dilememe izin verin - muhtemelen terminolojiyi topluyorum. Kapanmanın ne olduğuna dair belirsiz bir anlayışa sahibim, ancak gördüğüm davranışları açıklayamıyorum. En azından, bunun bir kapatma sorunu olduğunu düşünüyorum. Çevrimiçi arama yaptım, ancak istediğimi almak için doğru anahtar kelimeleri bulamadım.Neden Bazı Kapaklar 'Diğerleri' Friendlier '?
Özellikle - BENİM BENZER BENİM (en azından gözlerim) olan iki kod kodum var. Birincisi:
static void Main(string[] args)
{
Action x1 = GetWorker(0);
Action x2 = GetWorker(1);
}
static Action GetWorker(int k)
{
int count = 0;
// Each Action delegate has it's own 'captured' count variable
return k == 0 ? (Action)(() => Console.WriteLine("Working 1 - {0}",count++))
: (Action)(() => Console.WriteLine("Working 2 - {0}",count++));
}
bu kodu çalıştırmak ve x1() ve x2 çağırmak durumunda() onlar ayrı bir 'sayım' değerini korumak olduğunu göreceksiniz.
foreach(var i in Enumerable.Range(0,4))
{
x1(); x2();
}
Çıkışlar:
bana mantıklı ve okudum açıklamalar maçlarıWorking 1 - 0
Working 2 - 0
Working 1 - 1
Working 2 - 1
Working 1 - 2
Working 2 - 2
Working 1 - 3
Working 2 - 3
. Sahnelerin arkasında her delege/eylem için bir sınıf yaratılır ve sınıf 'sayım' değerini tutmak için bir alan verilir. Akıllı hissederek yatağa gittim!
AMA SONRA - Bu çok benzer bir kod çalıştı:
// x3 and x4 *share* the same 'captured' count variable
Action x3 =() => Console.WriteLine("Working 3 - {0}", count++);
Action x4 =() => Console.WriteLine("Working 4 - {0}", count++);
Ve (comment diyor gibi) davranış burada tamamen farklıdır. x3() ve x4() SAME sayım değerine sahip gibi görünüyor!
Working 3 - 0
Working 4 - 1
Working 3 - 2
Working 4 - 3
Working 3 - 4
Working 4 - 5
Working 3 - 6
Working 4 - 7
Ben neler görebilirsiniz - ama onlar farklı olarak ele alınır Gerçekten neden alamadım. Kafamda - gördüğüm özgün davranışı beğendim, ama sonradan örnek beni şaşırtıyor. Umarım bu mantıklıdır. Teşekkürler
İlk örneğinizde iki farklı "int count" değişken bildirimi vardı (ayrı yöntem çağrılarından).İkinci örneğiniz _same_ değişken bildirimini paylaşıyor. İlk örneğiniz, ikinci örnekteki "int say" ın ana programınızın alanı olduğu ile aynı davranacaktır. –