Đó là bởi vì foreach là có nghĩa là để lặp qua một thùng chứa, đảm bảo mỗi mục được truy cập một cách chính xác một lần, mà không thay đổi container, để tránh khó chịu tác dụng phụ.
Xem: foreach in MSDN
Nếu bạn có nghĩa là lý do tại sao sẽ thay đổi một yếu tố giống như một số nguyên không ảnh hưởng đến một container của số nguyên, cũng là vì các biến lặp trong trường hợp này sẽ là một kiểu giá trị và được sao chép, ví dụ:
// Warning: Does not compile
foreach (int i in ints)
{
++i; // Would not change the int in ints
}
Thậm chí nếu biến lặp là một loại tài liệu tham khảo, có hoạt động trở lại một đối tượng mới, bạn sẽ không bị thay đổi bộ sưu tập ban đầu, bạn sẽ chỉ được giao lại cho biến này phần lớn thời gian:
// Warning: Does not compile
foreach (MyClass ob in objs)
{
ob=ob+ob; // Reassigning to local ob, not changing the one from the original
// collection of objs
}
Ví dụ sau đây có khả năng để thực sự cải tiến đối tượng trong bộ sưu tập ban đầu bằng cách gọi một phương pháp đột biến:
// Warning: Does not compile
foreach (MyClass ob in objs)
{
ob.ChangeMe(); // This could modify the object in the original collection
}
Để tránh nhầm lẫn liên quan đến giá trị so với các loại tài liệu tham khảo với và các kịch bản nêu trên (cùng với một số lý do liên quan đến tối ưu hóa), MS đã chọn tạo biến số lặp lại readonly
.
Nguồn
2010-10-23 15:46:04
Ý anh là gì của vòng lặp while được read-only? Vòng lặp while là một cấu trúc; nó không chỉ đọc và đọc. Có thể bạn có thể đăng một số mã và/hoặc làm rõ câu hỏi của bạn, xin vui lòng? Cảm ơn. – CesarGon
Tôi nghĩ rằng anh ta đang nói về biến lặp, như trong foreach (Item theItem trong theItemList) ... theItem không thể được gán cho. –
Bây giờ anh ta đã làm sáng tỏ câu hỏi: anh ta đang nói về việc rao giảng thay vì trong thời gian đó. – CesarGon