Unterschiede bei der Initialisierung von Membern
-
Hallo!
Ich programmiere zwar schon längere Zeit mit C#, dennoch ist mir bei Membervariablen der Unterschied zwischen der Initialisierung im Konstruktor und der Initialisierung bei der Deklaration. Hier ein Beispiel:
Was ist der Unterschied zwischen
public class Test { MyObj obj = new MyObj(); public Test() { } }
und
public class Test { MyObj obj; public Test() { obj = new MyObj(); } }
-
Beim zweiten Beispiel ist obj halt null, solange bis du die Methode aufrufst.
Solltest du es als Memmbervariable noch in anderen Methoden benoetigen, kannt du
es erst nutzen nachdem du es mit Test() instanziert hast./EDIT: Habe mich auch verlesen; habe nicht gesehen, dass es sich hier um den Konstruktor handelt.
-
Ähhh Kommando zurück
Hab nicht richtig hingesehen
Sorry
-
public class Test { MyObj obj1 = new MyObj(); MyObj obj2; public Test(bool doSpecialThings) { obj2 = new MyObj(); } public Test() { obj2 = null; } }
Initialisiert man die Variable direkt bei der "Deklaration" dann braucht man sie nicht in jedem Konstruktor zu initialisieren.
Zusammengefasst:
Eigentlich sollte man die Variablen generell sofort initialisieren. Es sei denn sie wird nicht immer benötigt, dann macht man es in einem speziellen Konstruktor.
-
[edit]C# mit C++ verwechselt
[/edit]
-
Die Null-Initialisierung ist nicht nötig, da es die Standardinitialisierung für Verweistypen ist.
-
Also schon mal vielen Dank für die zahlreichen Posts. So wie ich das verstehe muss eine Variable, die bei der Deklaration initialisiert wird zwar nicht mehr im Konstruktor initialisiert werden, sie aber von der CLR beim Konstruktoraufruf initialisiert. Richtig?
-
Genauso werden beim Erstellen einer Instanz einer Klasse alle Instanzenvariablen zuerst mit ihren Standardwerten initialisiert, bevor die Initialisierungen der Instanzenvariablen ausgeführt werden. Jede Variableninistialisierung muss einen Wert des Variablentyps oder eines Typs liefern, der implizit in den Variablentyp konvertiert werden kann. Ein Variableninitialisierer kann zirkulär sein; in diesem Fall ist der Standardwert für die Initialisierung der Wert der Variablen. Der Wert einer solchen Initialisierung ist zweifelhaft.
-
Eine Initialisierung in C# ist die Zuweisung eines Wertes an ein Member direkt bei der Definition. Im Konstruktor etwas an den Member zuzuweisen ist keine Initialisierung mehr. Das hat zwei Folgen: Wenn der Konstruktor-Code ausgeführt wird, ist die Variable schon initialisiert. Deshalb ist es legal, die Variable gleich auszulesen, so wie hier:
class Test { public Test() { Console.Out.WriteLine(foo); } int foo; }
Und wenn im Konstruktor nochmal eine Zuweisung stattfindet, ist der neue Wert derjenige, der nach der Konstruktion gilt.
Im IL-Code sieht das anders aus. Aus der Zuweisung bei der Definition der Variable generiert der C#-Compiler Code, der im Konstruktor die Variable initialisiert. Intern gibt es also sowas wie eine Initialisierung gar nicht. Wann sollte man jetzt also initialisieren und wann zuweisen? Ich würde sagen, initialisieren, wenn es geht. Wenn man also keine Parameter braucht und die Initialisierung keine Exception werfen kann, die man fangen will. Denn um eine Initialisierung kann man kein try bauen, außer das findet wiederum in einer statischen Methode statt. Verkünsteln braucht man sich da aber IMHO nicht.
-
OK, jetzt ist mir alles klar. Vielen Dank nochmals!