使用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
並不多。我已經嘗試訪問這兩個示例中的屬性,並確保它只運行一次初始化工廠。許多'懶惰的'緩存示例都顯示了支持字段,我想知道爲什麼,因爲我認爲第一個示例更漂亮。例如。 http://stackoverflow.com/questions/5134786/cached-property-vs-lazyt?rq=1 –
第一個等同於編寫'Bootstrap = InitializeContainer();'。它不會將初始化委託給您訪問容器的時間,只是包含類的靜態構造函數運行的時間。在這種情況下使用'懶惰'沒什麼意義。 – Luaan