gpt4 book ai didi

c# - 是什么原因导致此列表在以一种方式调用时通过引用传递,但通过另一种方式传递值?

转载 作者:可可西里 更新时间:2023-11-01 08:42:00 26 4
gpt4 key购买 nike

我正在做一个运行验证方法的简单测试,遇到了这种奇怪的情况。

public IEnumerable<int> ints (List<int> l)
{
if(false)yield return 6;
l.Add(4);
}


void Main()
{
var a = new List<int>();
var b = new List<int>();
for( int i = 0; i < 4; i++ ){
a.Add(i);
b.Add(i);
}
a.AddRange(ints(a));
ints(b);
Console.WriteLine(a);
Console.WriteLine(b);
}

此代码运行后,a 将包含 [0,1,2,3,4]。但是,b 将包含 [0,1,2,3]。为什么在 AddRange 中将方法作为参数调用允许通过引用传递列表?或者,如果那没有发生,那发生了什么?

最佳答案

ints(b)调用不枚举 IEnumerable , 所以代码永远不会到达 l.Add(4)行,不像 AddRange枚举所有项目以将它们添加到列表中的情况。

要查看它需要 b case 手动枚举结果:

ints(b).ToList();

IEnumerable<T>通过函数实现的函数在枚举开始之前不执行函数体——代码实际上由编译器转换为具有状态的类,以支持可枚举的真正延迟评估(细节可以在多篇文章中找到,即 Iterator Pattern demystified - Tim 提供的链接施梅尔特)。

关于c# - 是什么原因导致此列表在以一种方式调用时通过引用传递,但通过另一种方式传递值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17330477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com