gpt4 book ai didi

c# - 如果它是一个结构数组,foreach 是否复制每个元素?

转载 作者:太空狗 更新时间:2023-10-29 18:32:08 25 4
gpt4 key购买 nike

我有一个结构数组。 foreach 运算符在遍历数组时会复制每个元素吗?据我了解,foreach 只是转换为 for 的语法糖。所以看起来答案是否定的,但我很想得到一些确认。

PS:看来应该有人问过,但我无法轻易找到任何东西。因此,请根据提供的引用投票作为副本。

最佳答案

是的,将制作值类型实例的副本。当遍历数组时,foreach 确实会使用数组访问而不是使用枚举器,但每个数组槽中的值仍会被复制。

这段代码:

struct AStruct
{
public string a;
public int b;

static void Main()
{
var structs = new AStruct[10];

foreach (var x in structs) {
Console.WriteLine(x);
}
}
}

Main() 方法生成以下 IL:

.method private static hidebysig
default void Main () cil managed
{
.entrypoint
.maxstack 4
.locals init (
valuetype AStruct[] V_0,
valuetype AStruct[] V_1,
int32 V_2,
valuetype AStruct V_3)
IL_0000: ldc.i4.s 0x0a
IL_0002: newarr AStruct
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: stloc.1
IL_000a: ldc.i4.0
IL_000b: stloc.2
IL_000c: br IL_002d

IL_0011: ldloc.1
IL_0012: ldloc.2
IL_0013: ldelema AStruct
IL_0018: ldobj AStruct
IL_001d: stloc.3
IL_001e: ldloc.3
IL_001f: box AStruct
IL_0024: call void class [mscorlib]System.Console::WriteLine(object)
IL_0029: ldloc.2
IL_002a: ldc.i4.1
IL_002b: add
IL_002c: stloc.2
IL_002d: ldloc.2
IL_002e: ldloc.1
IL_002f: ldlen
IL_0030: conv.i4
IL_0031: blt IL_0011

IL_0036: ret
} // end of method AStruct::Main

注意指令 IL_0013 到 IL_001d。每个数组槽的整个值被插入堆栈并存储在本地 V_3(x 迭代变量)中。

关于c# - 如果它是一个结构数组,foreach 是否复制每个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14408124/

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