Burada kimse ECMA-334'ü doğrudan alıntılamadığı için :
10.4.4.10 İfadeler için
Formun for-ifadesi için kesin atama kontrolü:
for (for-initializer; for-condition; for-iterator) embedded-statement
ifadesi yazılmış gibi yapılır:
{
for-initializer;
while (for-condition) {
embedded-statement;
LLoop: for-iterator;
}
}
Spesifikasyonda daha fazla,
12.16.6.3 Yerel değişkenlerin örneklenmesi
Yürütme değişkenin kapsamına girdiğinde yerel değişkenin somutlaştırıldığı kabul edilir.
[Örnek: Örneğin, aşağıdaki yöntem çağrıldığında, yerel değişken x
üç kez başlatılır ve döngünün her yinelemesi için bir kez başlatılır.
static void F() {
for (int i = 0; i < 3; i++) {
int x = i * 2 + 1;
...
}
}
Bununla birlikte, x
döngü dışının bildirimini hareket ettirmek, aşağıdakilerin tek bir örneğiyle sonuçlanır x
:
static void F() {
int x;
for (int i = 0; i < 3; i++) {
x = i * 2 + 1;
...
}
}
son örnek]
Yakalanmadığında, yerel bir değişkenin ne sıklıkta somutlaştırıldığını tam olarak gözlemlemenin bir yolu yoktur; Ancak, anonim bir işlev yerel bir değişkeni yakaladığında, somutlaştırmanın etkileri belirginleşir.
[Örnek: Örnek
using System;
delegate void D();
class Test{
static D[] F() {
D[] result = new D[3];
for (int i = 0; i < 3; i++) {
int x = i * 2 + 1;
result[i] = () => { Console.WriteLine(x); };
}
return result;
}
static void Main() {
foreach (D d in F()) d();
}
}
çıktı üretir:
1
3
5
Ancak, bildirimi x
döngü dışına taşındığında:
static D[] F() {
D[] result = new D[3];
int x;
for (int i = 0; i < 3; i++) {
x = i * 2 + 1;
result[i] = () => { Console.WriteLine(x); };
}
return result;
}
çıktı:
5
5
5
Derleyiciye, üç örneği tek bir delege örneğinde optimize etme izni verilir (ancak zorunlu değildir) (§11.7.2).
For-loop bir yineleme değişkeni bildirirse, bu değişkenin kendisi döngü dışında bildirilir. [Örnek: Dolayısıyla, örnek yineleme değişkeninin kendisini yakalamak için değiştirilirse:
static D[] F() {
D[] result = new D[3];
for (int i = 0; i < 3; i++) {
result[i] = () => { Console.WriteLine(i); };
}
return result;
}
çıktıyı üreten yineleme değişkeninin yalnızca bir örneği yakalanır:
3
3
3
son örnek]
Oh evet, sanırım bu değişken C ++ 'da değişken tarafından değer veya başvuru tarafından yakalanıp seçilmediğini seçebilirsiniz çünkü bu sorun oluşmaz belirtilmelidir (bkz: Lambda yakalama ).