リストについて
提供されたコードは、リストで参照型を使用するときによくある落とし穴を示しています。 Tag
クラスは参照型であるため、変数はオブジェクト自体のコピーではなく、オブジェクトのメモリ位置への 参照 を保持します。
ループ内では、同じ _tag
インスタンスが繰り返し変更されます。リストに追加するたびに、新しい Tag
オブジェクトは作成されません。代わりに、同じ _tag
オブジェクトに別の参照を追加します。 したがって、最後のリストには、. の _tag
最後に変更された状態
struct
を使用すると問題が解決する理由
構造体は値型であるため、public class Tag
を public struct Tag
に変更すると問題が解決します。 構造体が割り当てられると、構造体のデータのコピーが作成されます。 その結果、ループの各反復により、完全に独立した _tag
インスタンスが作成されます。 1 つのインスタンスを変更しても他のインスタンスには影響しないため、一意の Tag
オブジェクトを含むリストが作成されます。
派生コレクション クラスの関連性
この問題は、TagCollection
クラスの設計に固有のものではありません。 TagCollection
クラス自体は正しく実装されているようです。中心的な問題は、リストに値を設定するループ内で _tag
インスタンスがどのように処理されるか、特に単一の参照型インスタンスの繰り返し変更がどのように処理されるかにあります。
以上が参照型を使用する場合、リストに新しい値を追加すると以前の値が上書きされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。