Не совсем. Проектирование типа класса или структуры не должно зависеть от необходимости хранить его в коллекциях :). Вы должны посмотреть на «семантику», необходимую
Проблема, которую вы видите, связана с семантикой типа значения. Каждая переменная типа/reference типа значения представляет собой новый экземпляр. Когда вы говорите
Struct obItem = MyList[1];
Что происходит, так это то, Итак, у вас есть клон MyList [1], т. Е. 2 экземпляра. Теперь, если вы изменяете obItem, это не влияет на оригинал.
obItem.Name = "Gishu"; // MyList[1].Name still remains "peter"
Теперь терпите меня в течение 2 минут здесь (Это займет некоторое время, чтобы давиться .. это сделал для меня :) Если вам действительно нужно, чтобы быть Структуры хранятся в коллекции и модифицирована, как вы указали в вашем вопрос, вам придется сделать вашу структуру разоблачением интерфейса (Однако это приведет к боксу). Затем вы можете изменить фактическую структуру через ссылку на интерфейс, которая ссылается на объект в штучной упаковке.
Следующий фрагмент кода показывает, что я только что сказал выше
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. Хороший вопрос.
Обновление: @Hath - вы заставили меня бежать, чтобы проверить, не пропустил ли я что-то такое простое. (Было бы непоследовательно, если бы свойства setter и методы не выполнялись. Вселенная все еще сбалансирована :)
Метод сеттера не работает
obList2 [1] возвращает копию, состояние которой будет изменено. Исходная структура в списке остается неизменной. Так что Set-through-Interface, кажется, только способ сделать это.
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);
}
Это не полный ответ, ответ Гишу гораздо более полный. – Motti 2008-10-06 19:50:50
То, что сказал Джолсон, - это не столько, что структуры «неизменяемы». верно. -1 cos Действительно неправильно сказать, что структуры неизменяемы. – GuruC 2011-03-17 09:44:16
Чтобы быть справедливым к Эндрю - я не понимаю, что он говорит, что структуры являются «неизменными», он говорит, что они должны использоваться как *, если * они неизменяемы; и, конечно же, вы можете сделать их неизменными, если все поля прочитаны только. – Montdidier 2012-05-03 01:52:44