型をクラスまたは構造体として設計することは、コレクションに格納する必要性によって引き起こされるべきではありません:)必要な意味を見てください。
表示される問題は、値型セマンティクスによるものです。各値型の変数/参照は新しいインスタンスです。あなたが言うとき
Struct obItem = MyList[1];
何が起こるかは、構造体の新しいインスタンスが作成され、すべてのメンバーが1つずつコピーされるということです。 MyList [1]、つまり2つのインスタンスのクローンを持つようにします。 これで、obItemを変更しても、オリジナルには影響しません。今では私のためにした。これは、飲み込むにはしばらくかかります(ここでは2分間私と一緒にクマ:) をあなたが本当に構造体は、コレクションに保存されていると、あなたの中で示されたように変更する必要がある場合は
obItem.Name = "Gishu"; // MyList[1].Name still remains "peter"
質問、あなたは構造体を公開する必要があります(しかし、これはボクシングになります)。実際の構造体を、ボックス化されたオブジェクトを参照するインタフェース参照を介して変更することができます。
次のコードスニペットは、私はちょうど
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のプロパティがなく、メソッドがしていれば、.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);
}
これは完全な答えではありません、紀州の答えははるかに完全です。 – Motti
Jolsonが言ったこと - 構造体が「不変」であることはあまりありません。正しい。 -1 cos構造体が不変であると言うのは本当に間違っています。 – GuruC
Andrewにとって公正であること - 私は、structが "不変"であると言っていると解釈していません。すべてのフィールドが読み込み専用であれば、それらを不変にすることができます。 – Montdidier