Come mai con queste domande, la risposta sta nella L'esso genera. Per i seguenti esempi di codice:
public int X()
{
{
{
{
return 0;
}
}
}
}
public int Y()
{
return 0;
}
si finisce con il seguente: IL compilato
.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
Sono identici. quindi no, non ha alcun effetto sulle prestazioni. X
è orribile da leggere, ma questo è un altro problema.
Aggiornamento {}
incida sulla portata delle variabili, quindi forse questo potrebbe avere un effetto.Ancora una volta, controlliamo:
public int X()
{
var i = 1;
{
{
i++;
{
return i;
}
}
}
}
public int Y()
{
var i = 1;
i++;
return i;
}
una volta, però, l'IL prodotto è identico:
// 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
Tuttavia, se la variabile è catturato in una chiusura, essa incide cose. X
nel seguente caso vuol creare più di IL, che avrebbe un impatto sulle prestazioni:
public Func<int> X()
{
{
var i = 1;
{
i++;
{
return() => i;
}
}
}
}
public Func<int> Y()
{
var i = 1;
i++;
return() => i;
}
fonte
2015-07-14 17:19:14
No sono solo utilizzati per il raggruppamento. Anche questa domanda è fuori tema qui. – deathismyfriend
Tecnicamente sono ambiti ma suppongo che il compilatore sia abbastanza intelligente da rimuovere gli ambiti non necessari. – MiltoxBeyond
È improbabile aggiungere ulteriori parentesi graffe per rallentare il programma, poiché vengono utilizzati per specificare l'ambito. Questa domanda è stata discussa [qui] (http://stackoverflow.com/questions/6136853/why-does-c-sharp-allow-code-blocks-without-a-preceding-statement). –