gpt4 book ai didi

c# - 在集合类型上使用大括号初始化程序是否设置了初始容量?

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

在集合类型上使用大括号初始化器是否设置了它的容量,还是您仍然需要指定它?

也就是说,确实:

var list = new List<string>(){ "One", "Two" };

结果与此相同:

var list = new List<string>(2){ "One", "Two" };

最佳答案

对象初始化器简单地调用Add对于每个项目。

var list = new List<string>{ "One", "Two", "Three" };

如您所见,在本例中调用了无参数构造函数:

L_0000: nop 
L_0001: newobj instance void [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
L_0006: stloc.1
L_0007: ldloc.1
L_0008: ldstr "One"
L_000d: callvirt instance void [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
L_0012: nop
L_0013: ldloc.1
L_0014: ldstr "Two"
L_0019: callvirt instance void [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
L_001e: nop
L_001f: ldloc.1
L_0020: ldstr "Three"
L_0025: callvirt instance void [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
L_002a: nop
L_002b: ldloc.1

因此,您应该手动设置容量:

var list = new List<string>(5){ "One", "Two", "Three" };

编译成:

L_0000: nop 
L_0001: ldc.i4.5
L_0002: newobj instance void [mscorlib]System.Collections.Generic.List`1<string>::.ctor(int32)
// rest is same

因此,算法非常明显 - 它调用您指定的构造函数(默认情况下无参数),然后调用 Add对于每个项目。

注意:我知道,List<T> 的默认容量为 4我验证了如果我们在初始化器中传递超过 4 个项目会发生什么(例如,编译器可能根据项目计数确定调用哪个构造函数)但结果是相同的 - 默认情况下调用无参数构造函数。

我认为集合初始化器的目的是创建小集合(1 - 8 项),因此会对性能产生一点影响(如果将 8 项传递给初始化器,则只调整一次大小)。没有人期望您会对 100 个项目使用就地初始化。如果你打算这样做,你应该使用适当的集合构造函数。

关于c# - 在集合类型上使用大括号初始化程序是否设置了初始容量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18975450/

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