Il risultato compilato è lo stesso.
Il seguente C#:
static void Main()
{
var x = new List<int>();
var y = new List<int> { };
}
compila in quanto segue IL:
.method private hidebysig static
void Main() cil managed
{
// Method begins at RVA 0x2050
// Code size 14 (0xe)
.maxstack 1
.entrypoint
.locals init (
[0] class [mscorlib]System.Collections.Generic.List`1<int32> x,
[1] class [mscorlib]System.Collections.Generic.List`1<int32> y
)
IL_0000: nop
IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
IL_0006: stloc.0
IL_0007: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
IL_000c: stloc.1
IL_000d: ret
} // end of method Program::Main
Se si aggiunge un valore alle collezioni:
static void Main()
{
var x = new List<int>();
x.Add(1);
var y = new List<int> { 1 };
}
Questa è la risultante IL:
.method private hidebysig static
void Main() cil managed
{
// Method begins at RVA 0x2050
// Code size 32 (0x20)
.maxstack 2
.entrypoint
.locals init (
[0] class [mscorlib]System.Collections.Generic.List`1<int32> x,
[1] class [mscorlib]System.Collections.Generic.List`1<int32> y,
[2] class [mscorlib]System.Collections.Generic.List`1<int32> '<>g__initLocal0'
)
IL_0000: nop
IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldc.i4.1
IL_0009: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
IL_000e: nop
IL_000f: newobj instance void class [mscorlib]System.Collections.Generic.List`1<int32>::.ctor()
IL_0014: stloc.2
IL_0015: ldloc.2
IL_0016: ldc.i4.1
IL_0017: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
IL_001c: nop
IL_001d: ldloc.2
IL_001e: stloc.1
IL_001f: ret
} // end of method Program::Main
Questo mostra come gli inizializzatori di raccolta sono solo zucchero di sintassi. Poiché gli inizializzatori di raccolta non erano originariamente parte di C#, penso che le persone siano più abituate alla sintassi del costruttore. Se mi sono imbattuto in un codice che utilizzava un inizializzatore di raccolta vuoto, mi chiedo perché, ma certamente non ha alcun problema di leggibilità. Se uno è abbastanza intelligente da capire il codice, allora {}
vs ()
non dovrebbe essere così sconvolgente da minare la capacità di una persona di comprendere ciò che il codice sta facendo.Si tratta di una questione di opinione. Fai quello su cui la tua squadra è d'accordo, e se sei solo tu, allora usalo per i tuoi cuori.
'var floorplans = new List();' è il migliore IMO. Non ci sono aspetti negativi. –
In caso di dubbi controllare l'IL. Gli inizializzatori della raccolta sono semplicemente zucchero sintattico. –
FYI - ReSharper, per impostazione predefinita, genera un avviso sull'inizializzatore dell'oggetto vuoto. –