0

プロパティがいつ初期化されるのか、少し混乱しています。

次のように宣言されたプロパティがあるとします。

private Dictionary<string, Dictionary<string,string>> MessageLookup
    {
        get
        {
           return messages ?? doSomething();
        }
    }

doSomething メソッドはメッセージ ディクショナリにデータを入力し、それを返します。

私の質問は、このコードはいつ実行されるのですか? doSomething コードにブレークポイントを配置するとヒットしませんが、デバッガーで表示すると、MessageLookup プロパティがデータを保持しています (これが初期化される唯一の場所です)。

このコードは構築時に実行されますか? 変数名にカーソルを合わせると、デバッガーは自動的に実行しますか? もしそうなら、なぜブレークポイントにヒットしないのですか?

4

3 に答える 3

7

そのコードは、誰かがプロパティを参照する前ではなく、いつでも実行されます。

デバッガーを使用すると、デバッガーがプロパティ値を自動的にフェッチしようとするため、それが表示されます (オブジェクトの状態を確認できます)。デバッガーがそれ自体のプロパティを評価しているときにブレークポイントを無視するかどうかはわかりません-それですべてが説明されます。

デバッガーではなくコードを実行してみて、いくつかのコードがプロパティにアクセスするようにします。

var lookup = someObject.MessageLookup;

ダンプdoSomething()をスタック トレースにすると、何が起こっているかがわかります。

于 2009-08-03T19:53:34.990 に答える
0

プロパティの getter (さらに言えば) はpureToString()であると見なされます。これは、基本的に、それを評価しても副作用がないことを意味します。その仮定に準拠するようにコードを書き直す必要があります。そうしないと、厄介な結果に直面することになります。アクセス時に遅延初期化を使用する必要がある場合は、代わりにメソッドを使用してください。GetMessageLookup()

于 2009-08-03T20:03:05.237 に答える
0

プロパティが最初に評価されるときに実行されます。バックグラウンド処理はありません。

クイックウォッチを使用してオブジェクトを検査しているため、これは表示されていないと思います。その時点で実行され、ブレークポイントはスキップされます。

于 2009-08-03T19:53:09.577 に答える