質問

プロパティが正確に初期化されるタイミングについて少し混乱しています。

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

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

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

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

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

役に立ちましたか?

解決

このコードは、だれかがプロパティを参照するたびに実行されます。以前ではありません。

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

デバッガでコードを実行しないでください 、プロパティにアクセスするコードを作成します:

var lookup = someObject.MessageLookup;

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

他のヒント

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

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

プロパティゲッター(およびそのことに関する ToString())は、純粋。これは基本的に、評価しても副作用がないことを意味します。その前提に準拠するようにコードを書き直すか、厄介な結果。アクセス時に遅延初期化を使用する必要がある場合は、代わりに GetMessageLookup()メソッドを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top