.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
相关产品推荐
相关产品推荐

