そうではありません。型をクラスまたは構造体として設計することは、コレクションに格納する必要性によって駆動されるべきではありません:)必要な「セマンティクス」を確認する必要があります
表示されている問題は、値の型のセマンティクスが原因です。各値型の変数/参照は新しいインスタンスです。あなたが言う時
Struct obItem = MyList[1];
構造体の新しいインスタンスが作成され、すべてのメンバーが 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-私がそんなに簡単なものを見落としているかどうかを確認するために走ってもらいました。(セッタープロパティが存在しない場合、メソッドが行われた場合は一貫性がありません - .NETユニバースはまだバランスが取れています:)
セッターメソッドは機能しません
[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);
}