带<T>/不带支持字段的延迟缓存 - 性能?



使用 Lazy<T>属性缓存,使用背衬字段访问该属性或没有后盾字段之间是否存在任何行为差异?也许有任何性能?

下面的示例代码是在内部属性中缓存AUTOFAC IOC容器。该代码仅次于初始化一次。它是否遵循正确的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 我最有兴趣拥有容器的缓存价值,因此每次访问该属性时都不会初始化。我不在乎初始化是否被推迟。

imo在第一个示例调用。该行上的值使懒惰几乎毫无用处,因为它是在下次懒惰对象实例化的时候实例化容器如果对象的创建不推迟到以后的时间。

因此,如果您需要推迟对象的创建,那么我认为第二个示例会更好,因为直到容器被调用的第一个时刻才能初始化容器。

另一个示例将是一个不执行的字段。末尾值与第二个示例相同,但您必须在任何要使用它的地方致电.value,这使其有些不舒服。

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

因此,如果我在您的位置要比第一个完成操作的示例要花更多的时间

最新更新