C# 在其声明之后使用 Lazy.Value

本文关键字:Lazy Value 之后 声明 | 更新日期: 2023-09-27 18:32:04

在我正在处理的公司应用程序中有很多这样的代码:

var something = new Lazy<ISomething>(() =>
                    (ISomething)SomethingFactory
                    .GetSomething<ISomething>(args));
ISomething sth = something.Value;

根据我对Lazy的理解,这完全没有意义,但我是公司的新人,我不想无缘无故地争论。那么 - 这段代码有什么意义吗?

C# 在其声明之后使用 Lazy.Value

正在积极开发的代码从来都不是静态的,因此他们以这种方式编写代码的一种可能性是,以防他们稍后需要将赋值移动到代码中的另一个位置。 但是,这听起来好像发生在方法中,通常我希望 Lazy 初始化最常发生在类字段或属性中,这更有意义(因为您可能不知道类中的哪个方法会首先使用它)。

不幸的是,可能更多的是缺乏对 Lazy 功能在 C# 中如何工作的了解(或一般的 lazy init),也许他们只是试图使用他们发现的最新"酷功能"。

我见过一家公司代码中奇怪或奇怪的东西激增,仅仅是因为人们看到它以一种方式编码,然后只是复制它,因为他们认为原始人知道他们在做什么并且这是有道理的。 最好的办法是问为什么这样做。 最坏的情况是,您将了解公司的程序或编码实践。 最好的情况是,如果他们说"哎呀,我不知道",你可能会最终教育他们。

好吧,在这种情况下当然是没有意义的,因为您在创建对象后立即获得值,但也许这样做是为了遵循标准或类似的东西。

在我的公司,我们做类似的事情,在 Unity 容器中注册对象,并在注册实例后调用 Unity 来创建实例。

除非他们在方法中多次使用something,否则它似乎毫无用处,并且比立即执行操作的效率略低。 否则,Lazy<T>正在遍历Value get并检查该值是否已具体化,并执行Func调用。 对于延迟加载很有用,但如果它只是立即在方法中使用一次,则毫无意义。

但是,Lazy<T>通常对类的属性非常有帮助

如果将来要从方法中移出Lazy.Value,这可能会很有用,但无论如何,它可以被认为是过度设计,而不是最好的实现,因为在这种情况下,Lazy声明似乎被提取到属性中。

这么快 - 是的,它没用。