gpt4 book ai didi

C# 循环 : iterating through an array

转载 作者:可可西里 更新时间:2023-11-01 03:13:38 25 4
gpt4 key购买 nike

如果我有如下循环:

foreach (string pass in new string[] { "pass1", "pass2", "pass3" })
{
x = pass; //etc
}

匿名字符串数组是最初创建一次,还是每次传递都重新创建一次?

我相信前者,但同事们确信这是一个等待发生的错误,因为他们说 foreach 循环的每次迭代都会导致创建一个新的字符串数组。

VS 反汇编代码表明我是对的,但我想确定。

我们关注这个的原因是试图理解一个神秘的错误,该错误报告在迭代时集合已被更改。

最佳答案

根据 Eric Lippert blogspecification , foreach 循环是一个语法糖:

{
IEnumerator<string> e = ((IEnumerable<string>)new string[] { "pass1", "pass2", "pass3" }).GetEnumerator();
try
{
string pass; // OUTSIDE THE ACTUAL LOOP
while(e.MoveNext())
{
pass = (string)e.Current;
x = pass;
}
}
finally
{
if (e != null) ((IDisposable)e).Dispose();
}
}

如您所见,枚举器是在循环之前创建的。

@Rawling 正确指出,编译器对数组的处理方式略有不同。 Foreach 循环被优化为带有数组的 for 循环。根据The Internals of C# foreach您的 C# 5 代码将如下所示:

string[] tempArray;
string[] array = new string[] { "pass1", "pass2", "pass3" };
tempArray = array;

for (string counter = 0; counter < tempArray.Length; counter++)
{
string pass = tempArray[counter];
x = pass;
}

初始化也只发生一次。

关于C# 循环 : iterating through an array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114403/

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