9

Dato il seguente esempio, uno è oggettivamente migliore/più veloce/più sicuro dell'altro? L'istanza letterale dell'oggetto dovrebbe essere una pratica migliore dove è pratica?L'istante letterale dell'oggetto è più veloce dell'impostazione delle proprietà?

Dove è inappropriato?

class Person 
{ 
    public string name; 
    public int age; 
} 
void MakePeople() 
{ 
    Person myPerson = new Person(); 
    myPerson.name = "Steve"; 
    myPerson.age = 21; 

    Person literalPerson = new Person { name = "John", age = 22 }; 
} 
+3

L'IL generato da questi due metodi deve essere identico. Quindi, no. –

+2

Una riga anziché tre e più chiara su intento ed effetto. Potrebbe essere 10 volte più lento e sarebbe comunque una buona idea. Non riesco a comprendere la fissazione delle persone su piccole differenze di rendimento (come approccio predefinito, sono contento di ottimizzare le aree sensibili). – delnan

risposta

16

No, non è più veloce o più lento. È lo stesso.

Il compilatore traduce gli inizializzatori dell'oggetto in una chiamata del costruttore seguita dall'impostazione di tali proprietà.

Person literalPerson = new Person { name = "John", age = 22 }; 

si rivolge a:

Person myPerson = new Person(); 
myPerson.name = "John"; 
myPerson.age = 22; 

Si dovrebbe usare ciò che è più leggibile e ciò che avete concordato con il team.

+2

+1 per l'uso di ciò che è più leggibile (specialmente per l'ambiente di squadra) – JYelton

+5

Tecnicamente non è esattamente la stessa poiché il compilatore dichiara una variabile temporanea per mantenere l'assegnazione alla variabile atomica. –

+0

@KirkWoll È vero anche nel caso precedente in cui 'Persona' è un tipo di riferimento? –

0

Se date un'occhiata all'IL che viene generato, sono sicuro che troverete che sono identici. L'uso di inizializzatori di oggetti è solo una scorciatoia del compilatore.

1

O è appropriato. Dipende da cosa devi fare per impostare le proprietà. Ad esempio, vorrei evitare di un'istanza letterale nei casi in cui è necessaria una certa logica per arrivare ad un valore di proprietà:

Person myPerson = new Person(); 
myPerson.SomeProperty = if IsNewPerson ? GetPropertyFromDatabase() : GetDefaultProperty(); 

Edit:

Uno dei vantaggi di utilizzare inizializzazione dell'oggetto letterale in Visual Studio è che Intellisense richiederà le proprietà, mostrando solo quelle che non sono già state dichiarate. (Ho eseguito il codice in cui un valore è stato assegnato in modo ridondante quando si impostano le proprietà.)

+1

Questa è solo una preferenza personale. Potresti ancora farlo usando l'inizializzazione letterale. – Servy

+0

Si potrebbe ma diventa molto meno leggibile. – JYelton

+0

E la leggibilità è una questione di preferenza. Il mio punto non è che questo è male, solo che il codice generato è sempre lo stesso, anche nel tuo esempio. – Servy

0

Non penso che la velocità debba essere ciò che guida questa decisione. Probabilmente c'è poca differenza tra la velocità di entrambi i metodi.

Penso che la leggibilità del codice dovrebbe essere il fattore principale in cui andare. Utilizzando questi criteri, penso che siano molto vicini e dipende dalle preferenze personali o da qualsiasi altra decisione della tua squadra. Tuttavia, penso che nel caso di un oggetto che richiede l'impostazione di molte proprietà, chiamare setter in modo esplicito è un po 'più leggibile.

Problemi correlati