質問
私のリストが構造体および変えていきたいとの想いが一要素となります。例えば:
MyList.Add(new MyStruct("john");
MyList.Add(new MyStruct("peter");
今は、変更したい一つの要素:
MyList[1].Name = "bob"
しかし、いつどのようなことを取得します以下のようなエラー:
できな変更の戻り値 システム。ョンにします。クラスを提供します。.一覧です。この"int]'ではないので 変数
を利用した場合、リスト、授業に問題ないが発生します。
しないといけないのではないか回答して構造体"価値タイプです。
うにしている場合はリスト構造体のうち 読み取り専用?れば変更が必要な要素をリストにそれを使えばいいか迷っていクラスとな構造体?
解決
MyList[1] = new MyStruct("bob");
構造体はC#はほとんどの設計を変更できるのない方法変更の内部状態にしてください。.
このケースではたいへの全体構造体に指定された配列の指数は、変更してみてください単一の財産ます。
他のヒント
必ずしもそうではありません。設計タイプとしてのクラスまたはstructな駆動によりおく必要があるのでコレクション:)しておくとよいでしょう"の意味必要です
の問題だ見により値の型意味論。それぞれの値の型変数のスーパーコンピュータを用いた新しいインスタンス.という時に
Struct obItem = MyList[1];
そこで起こることは、新しいインスタンスの構造体が作成され、全員がコピーされます。ようにしてのクローンマ[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まっ走るってチェックすれば見落としも簡単です。(ることは一貫性がセッター特性のほと方法かった-。純宇宙はいまだにバランス:)
設定メソッドに動作しない
obList2[1]コピーを返します(その状態が変更されます。独自の構造体リスト滞在を変更.でセット経由でインタフェースがみついて教えてください。
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);
}
ではないことが構造体"を変更できません。"
現実の問題は、構造体は、値型ではなく、参照の型です。だから引き出した、"参照"の構造体のリストから、新しいコピー全体のstruct.変更内容まで変化するのコピーではなく、オリジナル版のリスト。
のようにアンドリュー国は、交換のstruct.している点がやろうと思い立ったら、そのときにだけはなぜで使用していstructのではなくクラス)いないが、その周り早期に最適です。
故障ではありません構造体に晒されている分野、又はその変異によ性セッター.構造体を変化させ、自らへの対応方法または財産のsetterかし、危険なので、によるフワつきを抑えることが出方法または財産のsetterかに対して呼び出される仮設構造体をインスタンス;場合にはsetterかの変更を行う構造体、その変更に終わって破棄されます。
しかしながら、コレクションに構築します。純真弱で露価値型オブジェクトに含まれる.最良のベットは通常次のように:
MyStruct temp = myList[1]; temp.Name = "Albert"; myList[1] = temp;
やや面倒ではありませんthreadsafe.まだ改善をもたらすリストのクラス型において同じことを要する可能性があると:
myList[1].Name = "Albert";
なものですが、これまでのところ必要と:
myList[1] = myList[1].Withname("Albert");
か
myClass temp = (myClass)myList[1].Clone(); temp.Name = "Albert"; myList[1] = temp;
もある。ひとつのか知ることができるようにな場合を除いて、検討myClassなどのその他のコードを入れています。でできることがない知ることができるようになるかどうかの形で安全な検証コードをアセンブリを一つになっています。一方で、名前が露出している分野MyStructの方法で行いました。での如何にかかわらず、他のMyStructを含む、またはの如何にかかわらずその他のものがきれいでしたがmyList前のコードを実行しまたはその期待が大きく関係しています。