2

アプリの起動時とシャットダウン時に状態を管理するために、オブジェクトにGUIDを割り当てる必要があります。を使用してルックアップ値を辞書に保存できるようです。

dictionary<int,Guid>.Add(instance.GetHashCode(), myGUID());

ここで知っておくべき潜在的な問題はありますか?

ノート

これは、実行の実行間で持続する必要はありません。そのようなGUIDのみです。

  • オブジェクトを作成します
  • gethashcode()、新しいまたは古いGUIDに関連付ける
  • アプリが終了する前に、gethashcode()とルックアップGUIDを使用して、GUIDを使用して永続化エンジンにupdate()またはinsert()します。

    唯一の前提は、プロセスの実行中、gethashcode()の一貫性が維持されることです。

    また、gethashcode()は同じオブジェクトタイプ(ウィンドウから派生)で呼び出されます

アップデート2-これが全体像です

  • 実行間でWPFユーザーコントロール(後でUCとして参照)に関する情報を格納するステートマシンを作成します
  • ユーザーコントロールの種類は時間の経過とともに変化する可能性があります(追加/削除)
  • 最初の実行では、以前の状態はありません。ユーザーはUCのサブセットと対話し、状態を変更します。これは、アプリの再起動時に再作成する必要があります。
  • この状態のスナップショットは、アプリが通常のシャットダウンを行ったときに取得されます
  • また、UCタイプの複数のインスタンスが存在する可能性があります
  • シャットダウン時に、各インスタンスにGUIDが割り当てられ、タイプ情報と状態情報とともに保存されます
  • これらのGUIDもすべてコレクションに保存されます
  • 再起動時に、GUIDごとに、オブジェクトを作成し、ref / guidを保存し、インスタンスごとに状態を復元して、アプリが以前とまったく同じように見えるようにします
  • ユーザーは、UCインスタンス/タイプを追加または削除したり、システムと対話したりできます。
  • シャットダウン時に、状態は再び保存されます
  • この時点での選択は、以前のすべての状態を削除/削除し、新しい状態情報を永続層(sql db)に挿入することです。
  • 時間の経過に伴う観察/分析では、多くのインスタンスが一貫性/静的であり、変更されないことがわかります-状態情報が非常に大きくなり、非ローカルデータベースに保存されるため、状態を再度削除/挿入する必要はありません
  • したがって、変更デルタのみが保持されます
  • デルタを計算するには、参照の寿命を追跡する必要があります
  • 現在List<WeakReference>、起動時に保存されています
  • シャットダウン時に、このリストと画面に表示されている実際のUCを繰り返し処理し、それに応じてキーを追加/更新/削除します
  • デルタを永続性に送信する

上記がそれを明らかにすることを願っています。

WeakReferenceだから今問題は-なぜリストを反復しながらnull参照のテストを排除する代わりに(usercontrolのみの)HashCodeを保存しないのですか?

更新3-すべてに感謝します。最後に弱参照を使用します

4

5 に答える 5

8

GetHashCodeを使用して、ハッシュテーブルのバランスを取ります。それが目的です。設計されていない他の目的に使用しないでください。それは非常に危険です。

于 2011-12-06T07:23:53.067 に答える
8

あなたはハッシュコードが一意であると想定しているようです。ハッシュコードはそのようには機能しません。詳細については、 GetHashCodeのガイドラインとルールに関するEric Lippertのブログ投稿を参照してください。ただし、基本的には、正常に動作するタイプに対して保証されている仮定のみを行う必要があります。つまり、2つのオブジェクトのハッシュコードが異なる場合、それらは完全に等しくありません。それらが同じハッシュコードを持っている場合、それらは等しいかもしれませんが、そうではないかもしれません

編集:前述のように、実行の実行間でハッシュコードを永続化しないでください。再起動しても安定するという保証はありません。あなたが何をしているのかははっきりしていませんが、良い考えとは思えません。

編集:さて、あなたはそれが永続的ではないことに気づいたので、それは良いスタートです-しかしあなたはまだハッシュコードの衝突の可能性に対処していません。なんで電話したいGetHashCode()の?辞書に参照を追加してみませんか?

于 2011-12-05T16:33:19.757 に答える
2

迅速で簡単な修正は

var dict = new Dictionary<InstanceType, Guid>();
dict.Add(instance, myGUID());

もちろん、InstanceType.Equalsがまだ実装されていない場合は、正しく実装する必要があります。(または実装IEQuatable<InstanceType>

于 2011-12-05T16:44:31.753 に答える
0

これはWPFコントロール用なので、依存関係プロパティとしてGuidを追加してみませんか?ハッシュコードを取得するために、ユーザーコントロールを既に反復しているように見えるので、これはおそらくより簡単な方法です。

コントロールが削除され、どのGuidが含まれていたかをキャプチャする場合は、終了/削除されたイベントをサブスクライブし、Guidとその他のいくつかの詳細を格納するマネージャーオブジェクトを使用することをお勧めします。そうすれば、必要に応じて、分析のために詳細を取得するのも簡単になります。

于 2011-12-06T20:02:35.160 に答える
0

私が考えることができる考えられる問題:

  • ハッシュコードの衝突により、辞書キーが重複する可能性があります
  • 異なるオブジェクトのハッシュアルゴリズムは、2つの機能的に異なるオブジェクトに対して同じハッシュコードを与える可能性があります。作業しているオブジェクトがわからない
  • この実装は、(上記のように)あいまいになる傾向があります。ハッシュコードだけでなく、オブジェクトに関するより多くの情報を保存する必要がある場合があります。

注-ジョンはこれをよりエレガントに言いました(上記を参照

于 2011-12-05T16:34:14.703 に答える