gpt4 book ai didi

c# - 如果我内联 HashSet 集合初始化,编译器是否知道只执行一次?

转载 作者:行者123 更新时间:2023-12-05 00:41:18 28 4
gpt4 key购买 nike

我经常这样做……

private void Check()
{
string s = "blah";

if ( new HashSet<string>{"Joe","Eddie","Buckethead"}.Contains(s) )
Debug.Log("Guitarist.");
}

在管道中,HashSet实际上是否只创建一次(在启动时?编译时?)然后每次都使用?

顺便说一句,我假设如果你这样做:

private HashSet<string> g = new HashSet<string>()
{"Joe","Eddie","Buckethead"};
private void Check()
{
string s = "blah";

if ( g.Contains(s) )
Debug.Log("Guitarist.");
}

那么确实,当然它只在类被实例化时执行一次。 (或者,也许在编译时/启动时?但无论如何,只有一次。)

最佳答案

这是您的第一个方法的 IL:

Check:IL_0000:  ldstr       "blah"IL_0005:  stloc.0     // sIL_0006:  newobj      System.Collections.Generic.HashSet..ctorIL_000B:  dup         IL_000C:  ldstr       "Joe"IL_0011:  callvirt    System.Collections.Generic.HashSet.AddIL_0016:  pop         IL_0017:  dup         IL_0018:  ldstr       "Eddie"IL_001D:  callvirt    System.Collections.Generic.HashSet.AddIL_0022:  pop         IL_0023:  dup         IL_0024:  ldstr       "Buckethead"IL_0029:  callvirt    System.Collections.Generic.HashSet.AddIL_002E:  pop         IL_002F:  ldloc.0     // sIL_0030:  callvirt    System.Collections.Generic.HashSet.ContainsIL_0035:  brfalse.s   IL_0041IL_0037:  ldstr       "Guitarist."IL_003C:  call        System.Console.WriteLineIL_0041:  ret         

这是第二种方法的代码:

Check:IL_0000:  ldstr       "blah"IL_0005:  stloc.0     // sIL_0006:  ldarg.0     IL_0007:  ldfld       gIL_000C:  ldloc.0     // sIL_000D:  callvirt    System.Collections.Generic.HashSet.ContainsIL_0012:  brfalse.s   IL_001EIL_0014:  ldstr       "Guitarist."IL_0019:  call        System.Console.WriteLineIL_001E:  ret         

这就是代码的优化编译。

所以,是的,第一个每次都会创建一个新的 HashSet

哦,我将 Debug.Log 更改为 Console.WriteLine,但这是一个微不足道的更改。

关于c# - 如果我内联 HashSet 集合初始化,编译器是否知道只执行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35351992/

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