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 私はなるように、コンテナのキャッシュされた値を持つことにほとんど興味それプロパティにアクセスするたびに初期化されません。初期化が延期されるかどうかは気にしません。
「正しいIoC/DI原則に従うかどうかは問題ではありません」疑問ではありませんが、常に質問するのは良いことです。 – Steven
あまりありません。両方の例でプロパティにアクセスしようとしましたが、初期化ファクトリを1回しか実行していないことを確認しました。多くの 'Lazy'キャッシングの例はバッキングフィールドと一緒に表示されています。最初の例がよりきれいだと思うので、私はなぜだろうかと思います。例えば。 http://stackoverflow.com/questions/5134786/cached-property-vs-lazyt?rq=1 –
最初のものは主に 'Bootstrap = InitializeContainer();'と書くのと同じです。コンテナにアクセスするときに、初期化を委譲しません。コンテナに格納されているクラスの静的コンストラクタが実行されるときだけです。このような場合に '' Lazy''を使用することにはほとんど意味がありません。 – Luaan