Không hoàn toàn. Thiết kế một loại như lớp hoặc cấu trúc không được thúc đẩy bởi nhu cầu của bạn để lưu trữ nó trong bộ sưu tập :) Bạn nên xem 'ngữ nghĩa' cần thiết
Sự cố bạn thấy là do ngữ nghĩa loại giá trị. Mỗi biến giá trị/tham chiếu là một cá thể mới. Khi bạn nói
Struct obItem = MyList[1];
điều gì xảy ra là trường hợp mới của cấu trúc được tạo và tất cả thành viên được sao chép từng cái một. Vì vậy, bạn có một bản sao của MyList [1] tức là 2 trường hợp. Bây giờ nếu bạn sửa đổi obItem, nó không ảnh hưởng đến bản gốc.
obItem.Name = "Gishu"; // MyList[1].Name still remains "peter"
Bây giờ chịu với tôi trong 2 phút ở đây (Điều này mất một thời gian để nuốt gọn .. nó đã làm cho tôi :) Nếu bạn thực sự cần cấu trúc được lưu trữ trong một bộ sưu tập và sửa đổi như bạn đã nêu trong của bạn câu hỏi, bạn sẽ phải làm cho cấu trúc của bạn lộ một giao diện (Tuy nhiên điều này sẽ dẫn đến boxing). Sau đó, bạn có thể sửa đổi cấu trúc thực tế thông qua tham chiếu giao diện, tham chiếu đến đối tượng được đóng hộp.
Đoạn mã sau minh họa những gì tôi vừa nói ở trên
public interface IMyStructModifier
{ String Name { set; } }
public struct MyStruct : IMyStructModifier ...
List<Object> obList = new List<object>();
obList.Add(new MyStruct("ABC"));
obList.Add(new MyStruct("DEF"));
MyStruct temp = (MyStruct)obList[1];
temp.Name = "Gishu";
foreach (MyStruct s in obList) // => "ABC", "DEF"
{ Console.WriteLine(s.Name); }
IMyStructModifier temp2 = obList[1] as IMyStructModifier;
temp2.Name = "Now Gishu";
foreach (MyStruct s in obList) // => "ABC", "Now Gishu"
{ Console.WriteLine(s.Name); }
HTH. Câu hỏi hay.
Cập nhật: @Hath - bạn đã cho tôi chạy để kiểm tra xem tôi có bỏ qua điều gì đó đơn giản không. (Nó sẽ không phù hợp nếu các thuộc tính setter không và các phương thức đã làm - vũ trụ .Net vẫn được cân bằng :)
Phương thức Setter không hoạt động obList2 [1] trả về một bản sao có trạng thái sẽ được sửa đổi. Cấu trúc ban đầu trong danh sách vẫn chưa được sửa đổi. Vì vậy, Set-via-Interface có vẻ là cách duy nhất để làm điều đó.
List<MyStruct> obList2 = new List<MyStruct>();
obList2.Add(new MyStruct("ABC"));
obList2.Add(new MyStruct("DEF"));
obList2[1].SetName("WTH");
foreach (MyStruct s in obList2) // => "ABC", "DEF"
{
Console.WriteLine(s.Name);
}
Đây không phải là câu trả lời đầy đủ, câu trả lời của Gishu hoàn chỉnh hơn nhiều. – Motti
Những gì Jolson nói - Nó không quá nhiều cấu trúc là "bất biến". đúng. -1 cos Thật sai khi nói rằng cấu trúc là không thay đổi. – GuruC
Để công bằng với Andrew - tôi không giải thích rằng ông nói rằng cấu trúc là "bất biến", ông nói rằng họ nên được sử dụng như * nếu * họ là bất biến; và chắc chắn bạn có thể biến chúng thành bất biến nếu tất cả các trường đều chỉ đọc. – Montdidier