懒惰和Func有什么区别?

时间:2019-07-18 07:37:56

标签: c# .net

在工厂类中,恒定服务用于从微服务获取数据。我想要该服务的延迟初始化。我发现了两种解决方法,两种方法都有效。

使用Func

public class ClientFactory: IClientFactory
{
    private readonly Func<IConstantService> _constants;

    public ClientFactory(Func<IConstantService> constants)
    {
        _constants = constants;
    }

    public Client GetClient()
    {
        return new Client(_constants().Uri);
    }
}

使用懒惰

public class ClientFactory: IClientFactory
{
    private readonly Lazy<IConstantService> _constants;

    public ClientFactory(Lazy<IConstantService> constants)
    {
        _constants = constants;
    }

    public Client GetClient()
    {
        return new Client(_constants.Value.Uri);
    }
}

有什么区别?

1 个答案:

答案 0 :(得分:4)

FuncLazy之间的基本区别在于,Func用于创建事物(即0+),而{ {1}}用于创建事物(单数或0-1)。

每次调用Lazy时,都有可能获得一个新值(“可能”是因为取决于Func的作用-它可能返回相同的值,也可能不会相同) )。

Func(默认情况下)将重复给您相同的值。即使多个线程要求提供Lazy的值,它们也会(默认情况下)全部获得相同的对象。 Lazy也(默认情况下)遭受exception caching的困扰,而Lazy却没有。

如果您希望Func无异常缓存,那么可能会感兴趣LazyWithNoExceptionCaching。这就是我每天使用的。

例如,在单例内部是使用Lazy而不是Func的常见位置。这样,单例可以Lazy根据需要建立另一个类型的多个实例。如果它使用new,它将只有一个其他类型的实例。

上面,我一直在说默认情况下。这是因为Lazydifferent modes。我的评论都是关于Lazy(默认行为)的。