代入演算子のオーバーロードはC#ではできませんが、デフォルトの演算子をブロックすることは可能ですか?代入演算子のオーバーロードのC#の不足を回避するには
状況:複雑な構造エディタを開発中です。それは、多数のクラスオブジェクトの組み合わせとそれらを一緒にリンクすることを可能にする。
多くのクラスのインスタンス間でこれらのリンクと参照を保存できるようにするには、各インスタンスがすべてのクラスにわたって一意のIDを持つ必要があります。私はそれを処理するIDクラス(コンテナオブジェクトへの参照を含む)を作成しました。 IDが一意であることを確認するために、私はクラスをスタティックlist<idClass> IDRegister
のすべてのインスタンスとスタティックlist<idClass> IDReferenceList
のすべてのIDインスタンスへの参照を登録するようにしました。
問題:使用する新しいIDインスタンスを1次割り当てまたは作成する際に、IDRegister
にIDを登録して、オブジェクトへの2つの参照を効率的に作成します。クラスインスタンスの使用中に、IDフィールドを別のクラスフィールド(既存または新規)で上書きするのが簡単になりました。登録されていないオブジェクトの通常の上書きはインスタンスを参照しないままにし、ガベージコレクションはメモリのクリーンアップを処理します。この場合、IDRegister
のインスタンスへの参照(場合によっては複数回IDReferenceList
)は、IDインスタンスを有効に保ち、古いインスタンスのコンテナオブジェクトを参照することで、それらもクリーンアップできなくなります。これらはすべて私のライブラリに大きなメモリリークを残してしまいます。
解決策?
私のライブラリのメモリリークを受け入れることができません。私は2つの選択肢があります:C + +に行くか、既定の割り当てがIDインスタンスへの既存の参照を上書きしないようにする方法を見つける。
または3番目のオプションはありますか?
これは、フィールドを変更する必要がある場合はIDRegisterのアクセスを許可する「インターフェイス」としても実行できますが、他のプログラマは書き込みアクセスを許可しないインターフェイスにのみアクセスできます。 –
ありがとうございますが、私はすでにこれを考えました。私の問題は、クラスインスタンス内での値の割り当てではありません(私はあなたのオプションに同意し、既にそれを持っています)。私の問題は、コンテナクラスのフィールドの割り当てです。 IDClass IDField = new IDClass();その後にIDField = new IDClass()またはIDField = SomeClassInstance.IDFieldが残って元のIDインスタンスが残されています – Leo
@Leo:なぜあなたはそれを読み取り専用にできませんか?おそらく、問題を示すより完全な例がありますか? –