1


0

私はHashtableオブジェクトを持っていて、それは文字列を使ってクラス内のさまざまなフィールドを "名前"または "マップ"します。

refクラスInterrupt {Interrupt(){this-> type = 0; this-> size = 0; int型; intサイズ。 }

割り込み^ interrupt = gcnew Interrupt();

Hashtable ^ map = gcnew Hashtable(); map-> Add( "InterruptType"、interrupt-> type); map-> Add( "InterruptSize"、interrupt-> size);

このクラスは実行時に変更されるため、型とサイズはどちらも2です。

さらに先に進むと、Hashtableにクエリを実行しましたが、値は変わりませんでした。 それは不変だからです。 参照の値を格納するのではなく、クラスのフィールドへのポインタを保持するようにHashtableを指定する方法はありますか?

私は生のintの代わりにカスタムオブジェクトを保持するためにクラスInterruptを修正できることを知っています、しかしそれはたくさんのリファクタリングを招くでしょう。

3 Answer


3


_ それは不変だからです。 _

あなたは間違って理解しています。 はい、整数は不変です。 しかし、整数は値型なのでマップの値は変わりませんでした。そのためマップのAdd()メソッドに値によって渡されました。 つまり、マップは、メソッドに渡された_変数_への参照ではなく、Add()メソッドに渡された値の_コピー_を保持します。

これを修正するには、整数を参照型(クラス)でラップし、マップにそのクラスの目的のインスタンスへの参照を渡す必要があります。 それからあなたがあなたの整数を変える時はいつでもあなたが正しいインスタンスのメンバーとしてそれらを変えていることを確認してください。


1


個々のint値ではなく、自分のHashtableがクラス自体への参照(Interrupt)を保持するように変更できます。 このように、インスタンスに基づいてint値を調べることができます。


0


あなたが辞書を使用して、そしてメンバーのアドレスを渡したならば、それは働くでしょう…​割り込みオブジェクトが固定されている限り。 しかし、Interruptはrefクラスなので、それにも多くの作業が必要になります。 私は正直に言って、あなたの最善の策は今弾丸を噛むこと、そしてあなたのリファクタリングをすることであると思う。