Nó sẽ có thể làm cho item
có thể thay đổi. Chúng ta có thể thay đổi cách mã được sản xuất để:
foreach (var item in MyObjectList)
{
item = Value;
}
Trở thành tương đương với:
using(var enumerator = MyObjectList.GetEnumerator())
{
while(enumerator.MoveNext())
{
var item = enumerator.Current;
item = Value;
}
}
Và sau đó nó sẽ biên dịch. Tuy nhiên nó sẽ không ảnh hưởng đến bộ sưu tập.
Và có chà xát. Mã:
foreach (var item in MyObjectList)
{
item = Value;
}
Có hai cách hợp lý để con người suy nghĩ về điều đó. Một là item
chỉ là một địa chủ sở hữu và thay đổi nó không khác nhau để thay đổi item
trong:
for(int item = 0; item < 100; item++)
item *= 2; //perfectly valid
khác là rằng việc thay đổi mục thực sự sẽ thay đổi bộ sưu tập.
Trong trường hợp trước đây, chúng tôi chỉ có thể gán mục cho một biến khác, và sau đó chơi với biến đó, vì vậy không mất mát. Trong trường hợp sau, cả hai trường hợp này đều bị cấm (hoặc ít nhất, bạn không thể mong đợi để thay đổi bộ sưu tập trong khi lặp lại nó, mặc dù nó không có được thực thi bởi tất cả điều tra viên) và trong nhiều trường hợp không thể cung cấp (tùy thuộc vào bản chất của số đếm). Ngay cả khi chúng tôi coi trường hợp trước là thực hiện "chính xác", thực tế là nó có thể được giải thích hợp lý bởi con người theo hai cách khác nhau là một lý do đủ tốt để tránh cho phép nó, đặc biệt là xem xét chúng ta có thể dễ dàng làm việc xung quanh trong mọi trường hợp.
Nguồn
2011-10-20 15:33:27
Tôi nghĩ bạn có nghĩa là "dưới mui xe" - nhưng nó không thực sự giống nhau chút nào. –
@ GianT971 Bạn có thể mô tả cách bạn sẽ 'làm tương tự' trong setter của bạn không? 'this = value'? – jv42
@JonSkeet Yess Dưới mui xe ^^. Ok vì vậy mục thực sự là một tham chiếu đến đối tượng, và không phải là đối tượng, tôi đã nhận nó ngay bây giờ – GianT971