You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6 WPF中Lazy未按需初始化,提前执行问题问询

问题根源与解决方案

你的代码里Lazy<List<int>>没起到延迟初始化作用,核心原因是你在创建Lazy对象时,直接提前执行了List的初始化代码。

看你写的这行:

Lazy<List<int>> myNumbersList = new Lazy<List<int>>(Enumerable.Range(1, 99999999).Select(x => x).ToList());

这里的Enumerable.Range(1, 99999999).Select(x => x).ToList()是一个立即执行的表达式——在Lazy对象实例化的瞬间,ToList()就会触发枚举,生成完整的List<int>,然后把这个现成的List传给Lazy的构造函数。这种用法下,Lazy只是“包裹”了一个已经创建好的对象,自然和myNumbersList2一样,在类初始化阶段就完成了List的创建。

正确的延迟写法

要让Lazy真正实现延迟初始化,你需要把List的创建逻辑包装成一个委托(Func<T>),让Lazy在首次访问Value属性时才执行这个委托:

// 把初始化逻辑放在lambda表达式里,作为Func<List<int>>传递
Lazy<List<int>> myNumbersList = new Lazy<List<int>>(() => 
    Enumerable.Range(1, 99999999).Select(x => x).ToList()
);

验证延迟效果

修改后,只有当你第一次访问myNumbersList.Value的时候,Enumerable.Range和ToList()才会执行,List才会被创建。比如你在按钮点击事件里写:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var list = myNumbersList.Value; // 这里才会触发List的初始化
}

此时List的创建逻辑才会运行,而不是在MainWindow构造之前。

内容的提问来源于stack exchange,提问作者Furkan Gözükara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:55:20