Wie immer bei solchen Fragen, die Antwort liegt in den IL es generiert. Für die folgenden Codebeispiele:
public int X()
{
{
{
{
return 0;
}
}
}
}
public int Y()
{
return 0;
}
wir mit folgenden kompilierten IL am Ende:
.method public hidebysig instance int32 X() cil managed
{
// Code size 2 (0x2)
.maxstack 8
IL_0000: ldc.i4.0
IL_0001: ret
} // end of method SomeType::X
.method public hidebysig instance int32 Y() cil managed
{
// Code size 2 (0x2)
.maxstack 8
IL_0000: ldc.i4.0
IL_0001: ret
} // end of method SomeType::Y
Sie sind identisch. also nein, es hat keinen Einfluss auf die Leistung. X
ist schrecklich zu lesen, aber das ist ein anderes Problem.
aktualisieren {}
wirkt sich auf den Umfang der Variablen, so vielleicht könnte dies eine Wirkung haben.Wieder ist überprüfen lassen:
public int X()
{
var i = 1;
{
{
i++;
{
return i;
}
}
}
}
public int Y()
{
var i = 1;
i++;
return i;
}
Sobald jedoch wieder, ist die IL produziert identisch: Jedoch
// Code size 8 (0x8)
.maxstack 2
.locals init ([0] int32 i)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: ldc.i4.1
IL_0004: add
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ret
, wenn die Variable in einem Verschluss erfasst wird, macht es die Dinge beeinflussen. X
im folgenden Fall nicht mehr IL schaffen, die einen Einfluss auf die Leistung haben würde:
public Func<int> X()
{
{
var i = 1;
{
i++;
{
return() => i;
}
}
}
}
public Func<int> Y()
{
var i = 1;
i++;
return() => i;
}
Nein, sie werden nur zum Gruppieren verwendet. Auch diese Frage ist hier nicht Thema. – deathismyfriend
Technisch sind sie Bereiche, aber ich würde annehmen, dass der Compiler intelligent genug ist, um die unnötigen Bereiche zu entfernen. – MiltoxBeyond
Hinzufügen von zusätzlichen geschweiften Klammern in unwahrscheinlich, das Programm langsamer zu machen, da sie zum Angeben des Bereichs verwendet werden. Diese Frage wurde [hier] diskutiert (http://stackoverflow.com/questions/6136853/why-does-c-sharp-allow-code-blocks-without-a-preceding-statement). –