9

Ist das folgende Beispiel objektiv besser/schneller/sicherer als das andere? Sollte die literale Instanziierung von Objekten eine Best Practice sein, wo es praktisch ist?Ist Object Literal Instanziierung schneller als das Festlegen von Eigenschaften?

Wo ist das unpassend?

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

Die generierte IL von diesen beiden Methoden sollte identisch sein. Also, nein. –

+2

Eine Zeile statt drei und klarer über Absicht und Wirkung. Es könnte 10 mal langsamer sein und es wäre immer noch eine gute Idee. Ich kann die Fixierung der Leute auf kleine Leistungsunterschiede nicht verstehen (als Standardansatz; ich bin glücklich, Hotspots zu optimieren). – delnan

Antwort

16

Nein, es ist nicht schneller oder langsamer. Es ist das Gleiche.

Der Compiler übersetzt Objektinitialisierer in einen Konstruktoraufruf, gefolgt von der Einstellung dieser Eigenschaften.

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

wendet sich an:

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

sollten Sie verwenden, was besser lesbar ist und was Sie haben mit Ihrem Team vereinbart.

+2

+1 für die Verwendung, was besser lesbar ist (insbesondere für Team-Umgebung) – JYelton

+5

Technisch ist es nicht genau das gleiche, da der Compiler eine temporäre Variable deklariert, um die Zuordnung zu Ihrer Variablen atomar zu halten. –

+0

@KirkWoll Stimmt das auch in dem obigen Fall, in dem "Person" ein Referenztyp ist? –

0

Wenn Sie einen Blick auf die IL werfen, die generiert wird, bin ich ziemlich sicher, dass Sie feststellen werden, dass sie identisch sind. Verwenden von Objektinitialisierern ist nur eine Compilerverknüpfung.

1

Entweder ist geeignet. Es hängt davon ab, was Sie tun müssen, um Eigenschaften festzulegen. Zum Beispiel würde ich wörtliche Instanziierung in Fällen vermeiden, in denen eine gewisse Logik in einem Eigenschaftswert benötigt wird, kommen Sie zu uns:

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

Edit:

Ein Vorteil der Verwendung wörtliche Objektinitialisierung in Visual Studio ist, dass Intellisense wird nach Eigenschaften gefragt, die nur diejenigen anzeigen, die noch nicht deklariert wurden. (Ich habe Code ausgeführt, bei dem beim Festlegen von Eigenschaften ein Wert redundant zugewiesen wurde.)

+1

Das ist nur persönliche Vorliebe. Sie könnten dies immer noch mithilfe der literalen Initialisierung tun. – Servy

+0

Sie könnten, aber es wird viel weniger lesbar. – JYelton

+0

Und Lesbarkeit ist eine Frage der Präferenz. Mein Punkt ist nicht, dass das schlecht ist, nur dass der generierte Code auch in Ihrem Beispiel immer noch derselbe ist. – Servy

0

Ich glaube nicht, dass die Geschwindigkeit diese Entscheidung beeinflussen sollte. Es gibt wahrscheinlich einen sehr kleinen Unterschied zwischen der Geschwindigkeit beider Methoden.

Ich denke, Code Lesbarkeit sollte der wichtigste Faktor sein, in dem Sie gehen. Mit diesen Kriterien denke ich, dass sie sehr eng sind und es kommt auf persönliche Vorlieben oder was auch immer dein Team entscheidet. Ich denke jedoch, dass im Falle eines Objekts mit vielen Eigenschaften, die gesetzt werden müssen, ein expliziter Aufruf von Sätzen etwas lesbarer ist.

Verwandte Themen