0

私は主にサービスを通じて構築されたPOCOクラスを持っています。私はいくつかの情報でサービスをヒットし、dtoを取り戻し、それを使用してオブジェクトの一部を構築します。私がやろうとしているのは、必要に応じてのみ満たされるように、いくつかの大きなプロパティを遅延ロードすることです。私はこれがそれを行う方法だと思いました:

        private List<User> _directReports;
        public List<User>DirectReports
        {
            get
            {
                if (this._directReports == null)
                {
                    SetDirectReports();
                }
                return this._directReports;
            }
            private set
            {
                this._directReports = value;
            }
        }

        private void SetDirectReports()
        {
            using (var client = new ADSClient())
            {
                this._directReports = client.GetDirectReports(this.Guid);
            }
        }

ここに問題があり、おそらく私は幽霊を追いかけていますが、デバッガーをステップスルーし、インスタンス化した後にオブジェクトの内臓を見ると、それらのフィールドには情報が含まれているはずであり、その段階ではなく、目的を完全に打ち負かします私がやろうとしていることの。だから私はこれを理解しようとしています、私はこれを間違っていますか?コンパイラは、私が考えていないポイントとしてgetメソッドを実行していますか?

4

2 に答える 2

1

これはデバッガーアーティファクトです。ウォッチまたはクイックインスペクトを使用してプロパティを確認すると、デバッガーはプロパティゲッターを実行して、その値を表示できるようにします。これにより、怠惰なinitコードが実行されます。したがって、プロパティがnullを返すことはありません。

覚えておくべきこと。

于 2012-06-28T17:35:17.410 に答える
0

高価なプロパティにアクセスするときに不必要に長く待機するユーザーがいないと仮定し、実行のたびに高価なプロパティにアクセスするわけではないと仮定すると、これは正常に機能します。

これらの条件のいずれかが指定されていない場合は、バックグラウンドで「高価な」プロパティを初期化することを検討してください。

バックグラウンドタスクがプロパティを初期化する前にフォアグラウンドタスク(UIなど)がプロパティにアクセスした場合、プロパティが初期化されるまでプロパティアクセスはブロックされます。

改善点は、次に初期化できるように特定のプロパティが必要になったことをバックグラウンド初期化タスクに通知することです。または、フォアグラウンドタスクがこの高価なプロパティの初期化を引き継ぐフォアグラウンドタスクとバックグラウンドタスクの間で調整します。

于 2012-06-28T17:30:03.743 に答える