構造体のリスト内の要素の値の変更
プログラミングでは、データ構造の操作が一般的なタスクです。構造体のリストを扱う場合、個々の要素の値を変更しようとすると、特定の問題が発生する可能性があります。この記事では、この問題の背後にある根本的な理由を調査し、考えられる解決策を示します。
構造体などの値型を使用する場合、各値型の変数または参照は、構造体の個別のインスタンスを表します。 Struct obItem = MyList[1]; など、リスト要素の値を新しい変数に割り当てると、コピーされたメンバーを含む新しいインスタンスが作成されます。 obItem に加えられた変更は、MyList 内の元の要素には影響しません。
この動作は、値の型のセマンティクスに起因します。新しい変数に値の型を割り当てるか、それを引数として渡すと、新しいインスタンスが作成され、値がコピーされます。これは、参照への変更が元のオブジェクトに影響するクラスなどの参照型とは対照的です。
構造体のリスト内の個々の要素を変更する問題に対処するには、1 つのアプローチは、次のインターフェイスを定義することです。構造体は実装されており、そのインターフェイスを使用して構造体にアクセスします。これにより、ボックス化されたオブジェクトを指すインターフェイス参照を通じて実際の構造体を変更できるようになります。
次のコード スニペットは、この手法を示しています。
public interface IMyStructModifier { string Name { set; } } public struct MyStruct : IMyStructModifier { public string Name { get; set; } } 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); }
このメソッドにより、元の構造体を変更できます。
コレクションに格納するために構造体を使用する場合とクラスを使用する場合のトレードオフを考慮することが重要です。構造体はパフォーマンス上の利点を提供し、不変性または小さなメモリ フットプリントが必要な場合に推奨されます。ただし、リスト内の要素を変更することが必須の場合は、クラスの方が適切なオプションになる可能性があります。
以上がC# で構造体のリスト内の個々の要素を変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。