2009-07-30 20 views
2

Mögliche Duplizieren:
Best Practice: Initialize class fields in constructor or at declaration?Best Practice zum Initialisieren von Elementvariablen?

Ich arbeite mit C#, aber das trifft wahrscheinlich auch auf Java (oder einer anderen Sprache, die auch dieses Verhalten erlaubt) ...

Welchen Weg ist vorzuziehen/beste Praxis? Angenommen, ich werde immer _memberVar

1.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = new Dictionary<int, string>(); 

    public MyClass() {} 
} 

brauchen - ODER -

2.

class MyClass 
{ 
    private Dictionary<int, string> _memberVar = null 

    public MyClass() 
    { 
     _memberVar = new Dictionary<int, string>(); 
    } 
} 

können nun sagen, dass MyClass ab 10 Konstrukteuren hat ... Also ich möchte nicht _memberVar = new Dictionary<int, string>(); in all diesen Konstruktoren lol haben. Ist etwas falsch mit dem 1. Weg? Dank

Edit: Ich weiß, ich kann die Konstrukteure Kette, aber das ist eine recht komplexe Klasse ... einige Konstrukteure nennen die Basis, einiger anderer Anruf Konstrukteuren bereits etc etc.

+0

Duplikat von http://StackOverflow.com/Questions/2451A/best-Practice-Initialize-Class-Fields-in-Constructor-Or-At-Declaration – M4N

+0

und Entschuldigung über die duple ... – Polaris878

Antwort

2

Sie müssen keine Mitgliedsvariablen initialisieren, aber es tut nicht weh, wenn Sie dies tun. Mitgliedsvariablen erhalten automatisch ihre Standardwerte, normalerweise eine null für Objekte und den Standardwert für primitive Typen (wie 0 für eine int).

Da Sie verschiedene Konstruktoren haben, müssen Sie die Elementinitialisierung nicht in jeder Version wiederholen, da Sie einen überladenen Konstruktor von jedem anderen wie bei einer überladenen Methode aufrufen können.

In Bezug auf Best Practice, persönlich Ich initialisiere Member Variablen im Konstruktor als dies ist, wo ich mein Objekt in einen stabilen Zustand "konstruieren" will. Mit anderen Worten, selbst wenn ich Membervariablen initialisiert hätte, wo ich sie deklariere, wenn der Konstruktor aufgerufen wird, wäre es so, als ob ich den Schiefer sauber wische.

0

Idealerweise sollten Sie Verwenden Sie hierfür die Abhängigkeitsinjektion. Dies bedeutet, dass Sie es dem Instanziierer Ihrer Klasse überlassen, neue Instanzen von Abhängigkeiten zu erstellen und sie in eine neue Instanz der Klasse einzufügen, anstatt dass die Klasse die Abhängigkeiten selbst erstellt.

+0

Dieser Code ist in der Provider ... soooo ja haha ​​ – Polaris878

+0

Ich würde diesen Rat mit einem Körnchen Salz nehmen. In der heutigen Zeit werfen Menschen bei jedem Problem eine "Abhängigkeitsinjektion", aber letztendlich ist ein Objekt dafür verantwortlich, andere Objekte zu instantiieren. In Ihrem Beispiel ist die Elementvariable ein 'Dictionary', also würde ich annehmen, dass es sich um ein Blattobjekt direkt am Ende des Objektdiagramms handelt. In diesem Fall würde das aktuelle Objekt dafür verantwortlich sein. –

0

Die erste Methode ist die Art und Weise, wie ich es im Allgemeinen mache, und ist völlig akzeptabel, wenn alle Ihre Konstruktoren es auf den gleichen Wert initialisieren würden. Ich bevorzuge es definitiv auch für statische Variablen, um die explizite Deklaration eines statischen Konstruktors zu vermeiden.

1

In Bezug auf _MemberVar in 10 Konstruktoren initialisiert werden: Ich denke, Sie müssen Ihre Klasse überdenken. Das klingt übertrieben. Wenn Sie in jedem Konstruktor dieselbe Arbeit ausführen, verletzen Sie DRY. Stattdessen versuchen, diese Struktur zu übernehmen:

public class MyClass { 
    Foo _foo; 
    Bar _bar; 
    Baz _baz; 

    public MyClass(Foo foo, Bar bar, Baz baz) { 
     _foo = foo; _bar = bar; _baz = baz; 
    } 

    public MyClass(Foo foo, Bar bar) : this(foo, bar, new Baz()) { } 

    public MyClass(Foo foo) : this(foo, new Bar()) { } 

    public MyClass() : this(new Foo()) { } 
} 

Beachten Sie, dass ich nicht Anruf in weitesten Konstruktor in jedem des Rest absichtlich tat, sondern kaskadiert, um Verhalten bei dem Sinne der Ausfälle erben geändert für jede.

Bei Member-Initialisierung bei der Deklaration, wenn das Element nicht mit einem der Argumente zu einem Konstruktor erstellt wird, möchte ich bei Deklaration initialisieren.

Verwandte Themen