6

There's a lot of code like this in company's application I'm working at:

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

ISomething sth = something.Value;

From my understanding of Lazy this is totally meaningless, but I'm new at the company and I don't want to argue without reason. So - does this code have any sense?

4

4 回答 4

4

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

不幸的是,这很可能是缺乏对 Lazy 特性在 C#(或一般的惰性初始化)中如何工作的了解,也许他们只是试图使用他们发现的最新“酷特性”。

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

于 2013-09-20T12:50:11.690 回答
1

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

因此很快 - 是的,它没用。

于 2013-09-20T13:12:53.037 回答
1

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

在我的公司,我们在 Unity 容器中注册对象并在注册后立即调用 Unity 来创建实例。

于 2013-09-20T12:47:36.113 回答
1

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

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

于 2013-09-20T12:48:24.623 回答