Tôi có một câu hỏi nhanh về hy vọng về các loại Action
và Lambdas trong C#. Đây là mã:Tham chiếu đối tượng C# và các loại Hành động
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
for (int I = 0; I < 10; I++)
actions.Add(new Action(() => Print(I.ToString())));
foreach (Action a in actions)
{
a.Invoke();
}
actions.Clear();
int X;
for (X = 0; X < 10; X++)
{
int V = X;
actions.Add(new Action(() => Print(V.ToString())));
}
foreach (Action a in actions)
{
a.Invoke();
}
Console.ReadLine();
}
public static void Print(string s)
{
Console.WriteLine(s);
}
Nếu bạn chạy mã này, bạn sẽ thấy nó xuất ra 10, mười lần liên tiếp, sau đó xuất số 0-9 lần thứ hai. Nó rõ ràng có một cái gì đó để làm với cách tôi sử dụng X vs tôi, và làm thế nào tôi cho hành động của tôi một biến V mới mỗi lần trong vòng lặp thứ hai ... Có thể mỗi V mới là một địa chỉ mới trong bộ nhớ, nhưng tôi đấu tranh để hiểu lý do tại sao I.ToString() không làm điều tương tự trong vòng lặp đầu tiên ... Tại sao không I.ToString() được sử dụng trong tác vụ Hành động đầu tiên giống như ví dụ thứ hai?
Điều này có thể hữu ích: http://stackoverflow.com/questions/3168375/using-the-iterator-variable-of-foreach-loop-in-a-lambda-expression-why-fails –