C#在声明后立即使用Lazy.Value

6

我正在工作的公司的应用程序中,有很多类似于这样的代码:

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

ISomething sth = something.Value;

根据我的理解,这段代码中的Lazy无意义,但是我刚到公司不想没有理由地争论。所以,这段代码有意义吗?

简单来说,这段代码毫无意义,你没有任何收益。从我的角度来看,你完全有理由对此进行争论,至少他们应该给出一个充分的理由(如果他们有有效的理由,请分享,我很好奇)。 - Alessandro D'Andria
4个回答

4
正在开发的代码是不静态的,因此他们将其编码方式设计成这样的一个可能性是以防以后需要将赋值移到代码中的其他位置。然而,这似乎是在方法中发生的,通常我预计懒加载最常用于类字段或属性,这将更有意义(因为您可能不知道类中的哪个方法会首先使用它)。
不幸的是,这也很可能是缺乏对C#中懒加载特性的了解(或者懒初始化的一般知识),或者他们只是尝试使用他们了解的最新的 “酷特性”。
我曾经在公司的代码中看到过奇怪或不寻常的事物,仅仅因为人们看到它被编码成一种方式,然后只是复制它,因为他们认为原始编码者知道他们在做什么并且有意义。做的最好的事情就是问为什么要这样做。最坏的情况是,你会了解公司的程序或编码实践。最好的情况是,如果他们说“天哪,我不知道”,那么你可能会教育他们。

1

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

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


1
这是使用 DI 框架时的适当实践,其中一致性通常很关键。不要感到难过! - Gusdor

1
除非在方法中多次使用something,否则它似乎毫无用处,并且比立即执行操作略微不高效。否则,Lazy<T>要经过Valueget来检查值是否已经实例化,并进行Func调用。对于延迟加载很有用,但如果它只在一个方法中立即使用一次,则是无意义的。 Lazy<T>通常对类的属性非常有帮助。

1

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

因此简而言之- 是的,它是无用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接