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.
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 ...
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.
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.
Tags und Links c# constructor member