Was ist der Unterschied zwischen new in einem Konstruktor und new in einer Member-Deklaration?

8

Was ist der Unterschied zwischen new in einem Konstruktor und new in einer Member-Deklaration?

Beispiel

%Vor%

Was ist der beste Weg, um es zu tun, und gibt es irgendwelche Leistungsprobleme?

    
retide 13.05.2012, 23:26
quelle

5 Antworten

10

Sie sind ziemlich gleichwertig (Unterschiede in Bezug auf Leistung und Speichernutzung sind vernachlässigbar). Der einzige wirkliche Unterschied ist, dass wenn Sie tun:

%Vor%

... die Zuweisung erfolgt immer unabhängig davon, welcher Konstruktor zum Erstellen einer Instanz des Objekts verwendet wird. Wenn Sie die Zuweisung innerhalb eines Konstruktors ausführen, geschieht dies nur, wenn dieser spezifische Konstruktor verwendet wird.

Wenn Sie also mehrere Konstruktoren haben, aber name immer auf die gleiche Weise initialisieren möchten, ist es etwas kürzer, das erste Formular zu verwenden, als es explizit in jedem Konstruktor zu initialisieren.

Im Allgemeinen bevorzuge ich jedoch die Initialisierung von Feldern in den Konstruktorimplementierungen, auch wenn dies den Code in manchen Fällen ausführlicher macht.

    
aroth 13.05.2012 23:31
quelle
4

Ein Argument im Konstruktor (Nicht-Standardkonstruktor) ermöglicht mir bessere Tests. Sie können bestimmte Daten in ein Mitgliedsfeld "injizieren", die Sie nicht unbedingt tun könnten, ohne dieses Mitglied öffentlich zu machen (oder zumindest intern) oder einen zweiten Aufruf mit einer "Setter" -Eigenschaft durchzuführen.

Da Sie mehrere Konstruktoren haben können, könnten Sie eine zweite zum Testen in Verbindung mit einem Standardkonstruktor haben, wenn Sie das wirklich wollen.

Es gibt keine wirklichen Leistungsprobleme, außer dass Sie einen separaten Aufruf zum späteren Auffüllen von Daten oder weniger wartbaren Code mit mehreren Aufrufen der Klasse vornehmen müssen (eine zum Erstellen des Objekts, die zweite zum Auffüllen des Elements). .

BEARBEITEN : Ich habe bemerkt, dass ich die falsche Frage beantwortet habe. Ich dachte, er würde nach dem Unterschied zwischen Standard- und Nichtstandardkonstruktoren fragen. Jetzt sehe ich, dass es um einen Standardkonstruktor ging, der das Mitglied im Konstruktor vs. in der Elementdeklaration initialisiert ...

    
Killnine 13.05.2012 23:29
quelle
1

Die zwei sind gleichwertig. Der Compiler verschiebt die Initialisierung solcher Elemente in den Konstruktor (statischer Konstruktor, wenn das Element statisch ist). Ich würde nicht sagen, dass es einen allgemein besten Weg gibt, es zu tun - sei einfach konsistent, wo immer es möglich ist, und wenn es in der Situation mehr Sinn macht, benutze es.

    
TheEvilPenguin 13.05.2012 23:30
quelle
1

Initialisieren Sie Instanzmitglieder im Konstruktor, initialisieren Sie Klassenmitglieder in der Deklaration. AFAIK dies ist (nur) die Konvention, und es gibt keine Leistungseinbußen. IMHO sollte dies in die Sprachregel (Syntax / Semantik) gezwungen werden.

    
LeleDumbo 13.05.2012 23:30
quelle
1

Durch das Initialisieren von Feldern im Konstruktor können Sie dieses Problem ebenfalls vermeiden:

%Vor%

Wenn Sie mit diesem Code den zweiten Konstruktor aufrufen, erstellen Sie unnötigerweise eine Liste, die fast sofort aufgegeben und für die Garbage Collection freigegeben wird.

    
phoog 14.05.2012 03:14
quelle

Tags und Links