我有两种情况:
static void CreateCopyOfString()
{
string s = "Hello";
ProcessString(s);
}
和
static void DoNotCreateCopyOfString()
{
ProcessString("Hello");
}
这两种情况的 IL 如下所示:
.method private hidebysig static void CreateCopyOfString() cil managed
{
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] string s)
IL_0000: nop
IL_0001: ldstr "Hello"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call void ConsoleApplication1.Program::ProcessString(string)
IL_000d: nop
IL_000e: ret
} // end of method Program::CreateCopyOfString
和
.method private hidebysig static void DoNotCreateCopyOfString() cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Hello"
IL_0006: call void ConsoleApplication1.Program::ProcessString(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::DoNotCreateCopyOfString
在第一种情况下,需要额外调用string init
,stloc.0
和ldloc.0
。这是否意味着第一种情况会比第二种情况下的表现要弱,后者将字符串直接传递给方法而不是首先将其存储在局部变量中?
我看到了问题是否初始化具有 null 的局部变量会影响性能?但这似乎与我在这里需要知道的有点不同。谢谢。