Не совсем. Проектирование типа как класса или структуры не должно зависеть от необходимости хранить его в коллекциях :) Вам следует взглянуть на «семантику», необходимую
Проблема, которую вы видите, связана с семантикой типа значения. Каждая переменная / ссылка типа значения является новым экземпляром. Когда ты сказал
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);
}
НТН. Хороший вопрос.
Обновление: @Hath - вы заставили меня бежать, чтобы проверить, упустил ли я что-то такое простое. (Было бы непоследовательным, если бы свойства сеттера отсутствовали, а методы были - вселенная .Net все еще сбалансирована:)
Метод установки не работает
obList2 [1] возвращает копию, состояние которой будет изменено. Исходная структура в списке остается неизменной. Так что Set-via-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);
}