Имам две ситуации:
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
. Това означава ли, че първият случай ще се представи по-слабо от втория случай, когато низът се предава директно на метода, вместо първо да се съхранява в локалната променлива?
Видях въпроса Влияе ли инициализацията на локална променлива с нула върху производителността?, но изглежда е малко по-различно от това, което трябва да знам тук. Благодаря.