2010-03-12 4 views
26

Klasse A verwendet eine Initialisierungsliste, um das Element auf den Parameterwert festzulegen, während Klasse B eine Zuweisung innerhalb des Konstruktors verwendet.Bei der Initialisierung in C# -Konstruktoren, was ist besser: Initialisierungslisten oder Zuweisung?

Kann jemand irgendeinen Grund geben, eins über dem anderen zu bevorzugen, solange ich beständig bin?

class A 
{ 
    String _filename; 

    A(String filename) : _filename(filename) 
    { 
    } 
} 


class B 
{ 
    String _filename; 

    B(String filename) 
    { 
     _filename = filename; 
    } 
} 

Antwort

67

Die erste ist in C# nicht legal. Die einzigen zwei Elemente, die nach dem Doppelpunkt in einem Konstruktor angezeigt werden können, sind base und this.

Also würde ich mit dem zweiten gehen.

+9

Danke, von C++ kommend, habe ich mich gefragt, ob Syntax A (Mitgliederinitialisierungsliste) auch für C# geeignet ist. –

15

Meinten Sie C++ statt C#?

C++ initializer Listen sind besser als Zuweisung für ein paar Gründe:

  • Für POD-Typen (int, float, etc ..), der Optimierer kann eine effizientere Memcpy hinter den Kulissen oft tun wenn Sie Initialisierer für die Daten bereitstellen.
  • Für Nicht-POD-Typen (Objekte) gewinnen Sie Effizienz, indem Sie nur eine Konstruktion ausführen. Bei der Zuweisung im Konstruktor muss der Compiler zuerst Ihr Objekt konstruieren und dann in einem separaten Schritt zuweisen (dies gilt auch für POD-Typen).
0

C# hat eine Funktion namens Object Initializer. Sie können Werte angeben, die der Compiler zum Initialisieren der angegebenen Elemente verwendet, und den Standardkonstruktor aufrufen. Damit dies funktioniert, benötigen Sie einen öffentlichen Standardkonstruktor.