Nếu tôi sử dụng:Tại sao Danh sách <T> .ForEach cho phép danh sách của nó được sửa đổi?
var strings = new List<string> { "sample" };
foreach (string s in strings)
{
Console.WriteLine(s);
strings.Add(s + "!");
}
các Add
trong foreach
ném một InvalidOperationException (Bộ sưu tập đã được sửa đổi; hoạt động liệt kê không thể thực hiện), mà tôi cân nhắc hợp lý, vì chúng ta đang kéo tấm thảm từ dưới chân chúng ta.
Tuy nhiên, nếu tôi sử dụng:
var strings = new List<string> { "sample" };
strings.ForEach(s =>
{
Console.WriteLine(s);
strings.Add(s + "!");
});
nó kịp bắn chính nó trong chân bằng vòng lặp cho đến khi nó ném một OutOfMemoryException.
Điều này đến như một điều bất ngờ đối với tôi, vì tôi luôn nghĩ rằng List.ForEach chỉ là một trình bao bọc cho foreach
hoặc cho for
.
Có ai có lời giải thích về cách thức và lý do hành vi này không?
(Inpired bởi ForEach loop for a Generic List repeated endlessly)
Tôi đồng ý. Đây là - đáng ngờ. Tôi wusggest bạn đăng rằng trên microsoft kết nối và yêu cầu làm rõ. – TomTom
"Điều này đến như là một bất ngờ đối với tôi, như tôi luôn luôn nghĩ rằng List.ForEach hoặc là chỉ là một wrapper cho' foreach' hoặc cho 'for'." Nó vẫn có thể sử dụng 'for'. Bạn có thể thực hiện cùng một hành động trong một vòng lặp 'for' và tạo ra cùng một kết quả OutOfMemoryException. –
Điều này dựa trên câu hỏi của tôi: http://stackoverflow.com/q/9311272/132239, cảm ơn SWeko vì đã đi vào chi tiết của nó – Sypress