【发布时间】:2023-03-28 07:02:01
【问题描述】:
对于延迟评估的属性,以下两种方法(带有支持字段的属性和带有默认值的属性)之间是否有任何区别,或者它们是否等效?
// (1)
public static class Foo
{
private static readonly Lazy<Foo> instance = new Lazy<Foo>();
public static Foo Instance { get; } = instance.Value;
}
// (2)
public static class Foo
{
public static Foo Instance { get; } = new Lazy<Foo>().Value;
}
我想要实现的是 Foo 的实例仅在访问 Foo.Instance 时创建,而不是在之前 --- 更何况,当从未访问过 Foo.Instance 时,不应创建任何实例。
【问题讨论】:
-
是的,第二个没有效果,因为它将构造惰性对象,然后立即评估它。属性后的
= xxx语法初始化属性值,这会强制惰性对象立即求值。 -
@LasseVågsætherKarlsen 这就是我的想法。谢谢你说清楚。
-
虽然知道第一个也不起作用,但你想要这个:
public static Foo Instance => instance.Value; -
所以在这方面,不,它们没有什么不同 :) 但它们也没有按预期工作(我希望)。
-
这是因为您使用
= new Lazy<Foo>().Value为Instance分配了一个值,并且在初始化Foo时对其进行了评估。相比之下,Lasse 的建议是有效地为属性的get方法编写一个实现。
标签: c# lazy-evaluation lazy-initialization