Tôi đã học C#, và tôi đang cố gắng hiểu lambdas. Trong mẫu này dưới đây, nó in ra 10 mười lần.Làm thế nào để nói một hàm lambda để chụp một bản sao thay vì một tham chiếu trong C#?
class Program
{
delegate void Action();
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
for (int i = 0; i < 10; ++i)
actions.Add(()=>Console.WriteLine(i));
foreach (Action a in actions)
a();
}
}
Rõ ràng, các lớp được tạo ra phía sau lambda được lưu trữ một tham chiếu hoặc con trỏ vào biến int i
, và được gán một giá trị mới để tham chiếu cùng mỗi lần lặp loop. Có cách nào để buộc các lamda để lấy một bản sao thay vào đó, giống như cú pháp C++ 0x
[&](){ ... } // Capture by reference
vs
[=](){ ... } // Capture copies
Bạn có thể muốn đọc [bài viết này] (http://csharpindepth.com/Articles/Chapter5/Closures.aspx), được viết bởi Jon Skeet rất riêng của chúng tôi. –
có thể trùng lặp của [C# Captured Variable In Loop] (http://stackoverflow.com/questions/271440/c-sharp-captured-variable-in-loop) – nawfal
Tôi thấy tò mò rằng hầu hết các câu trả lời cho câu hỏi này là giải thích ngữ nghĩa chụp hoàn toàn rõ ràng cho tác giả của câu hỏi trong khi chỉ một số đề cập đến giải pháp (bản sao tạm thời). Không ai đọc câu hỏi trước khi trả lời? – ghord