2017-02-21 4 views
0

Lazy<T>プロパティキャッシングを使用すると、バッキングフィールドでプロパティにアクセスするか、バッキングフィールドなしでプロパティにアクセスする間に動作に違いがありますか?おそらくどんなパフォーマンスヒットでしょうか?レイジー<T>バッキングフィールドの有無にかかわらずキャッシング - パフォーマンス?

次のコード例は、内部プロパティーにAutofac IoC containerをキャッシングしています。コードは一度だけ初期化されることを意図しています。それが正しいIoC/DI原則に従うかどうかは問わない。

例1:

internal static ILifetimeScope Bootstrap = new Lazy<ILifetimeScope>(InitializeContainer, LazyThreadSafetyMode.ExecutionAndPublication).Value; 

private static ILifetimeScope InitializeContainer() 
{ 
    ContainerBuilder builder = new ContainerBuilder(); 
    //Registration logic... 
    return builder.Build(); 
} 

例2:

private static readonly Lazy<ILifetimeScope> _container = new Lazy<ILifetimeScope>(InitializeContainer, LazyThreadSafetyMode.ExecutionAndPublication); 

internal static ILifetimeScope Container => _container.Value; 

private static ILifetimeScope InitializeContainer() 
{ 
    ContainerBuilder builder = new ContainerBuilder(); 
    //Registration logic... 
    return builder.Build(); 
} 

編集1 私はなるように、コンテナのキャッシュされた値を持つことにほとんど興味それプロパティにアクセスするたびに初期化されません。初期化が延期されるかどうかは気にしません。

+0

「正しいIoC/DI原則に従うかどうかは問題ではありません」疑問ではありませんが、常に質問するのは良いことです。 – Steven

+0

あまりありません。両方の例でプロパティにアクセスしようとしましたが、初期化ファクトリを1回しか実行していないことを確認しました。多くの 'Lazy 'キャッシングの例はバッキングフィールドと一緒に表示されています。最初の例がよりきれいだと思うので、私はなぜだろうかと思います。例えば。 http://stackoverflow.com/questions/5134786/cached-property-vs-lazyt?rq=1 –

+1

最初のものは主に 'Bootstrap = InitializeContainer();'と書くのと同じです。コンテナにアクセスするときに、初期化を委譲しません。コンテナに格納されているクラスの静的コンストラクタが実行されるときだけです。このような場合に '' Lazy''を使用することにはほとんど意味がありません。 – Luaan

答えて

1

最初の例でIMOを呼び出すと、その行の.Valueは、遅延オブジェクトがインスタンス化される次の時刻にコンテナをインスタンス化するため、Lazyをほとんど役に立たなくします。後の時間に遅れることはない。

オブジェクトの作成を延期する必要がある場合は、コンテナが呼び出される最初の瞬間までコンテナが初期化されないため、2番目の例が良いと思います。

もう1つの例は、最後の.Valueを行わないフィールドなので、2番目の例と同じですが、どこでも.Valueを呼び出して使用する必要があり、少し不快になります。

internal static Lazy<ILifetimeScope> Bootstrap = new Lazy<ILifestimeScope>(InitializeContainer, LazyThreadSafetyMode.ExecutionAndPublication);

私はあなたの場所にあったのであれば、私は第二の例のために行くだろう快適呼び出すと便利遅延読み込みを行い、それを呼び出すための最初の時間は非常にコンテナを初期化することを覚えておくの両方最初の例より少し時間がかかります。

+0

私は主に、キャッシュされた値を持ち、作成を延期しないことに興味があります。 –

+0

これはほぼ同じですが、コンテナがスレッドセーフでなければならないかどうか評価します。そうであればLazyを使用し、そうでない場合は静的なコンストラクタを使用できます。 Lazyはスタティックctorに少しオーバーヘッドがありますが、正しく設定されていればスレッドの安全を保証します。そして、2つの例の間で、どちらか一方を使用した場合のパフォーマンスに大きな打撃があるとは思わない – fmaccaroni

関連する問題