Moin,
ich bin gestern über etwas gestolpert, zu dem ich im Netz zum Suchparamater "object initializer" leider nicht das Richtige finde.
Es geht um folgenden Code:
class Program
{
static void Main(string[] args)
{
var firstClass = new FirstClass
{
SecondClass =
{
MyString = "Test"
}
};
}
}
class FirstClass
{
public FirstClass()
{
SecondClass = new SecondClass(2);
}
public SecondClass SecondClass { get; set; }
}
class SecondClass
{
public SecondClass(int myInt)
{
MyInt = myInt;
MyString = "Zweite Klasse";
}
public string MyString { get; set; }
public int MyInt { get; set; }
}
Und dabei um diese Stelle:
var firstClass = new FirstClass
{
SecondClass =
{
MyString = "Test"
}
};
SecondClass wird in diesem Fall ja im Konstruktor der FirstClass instanziiert und danach wird noch der Wert "Test" zur Property MyString zugewiesen.
Wird die SecondClass im Konstruktor nicht instanziiert, knallt es natürlich.
Ich kenne natürlich die Objektinitialisierer, bei denen man z.B. sowas schreiben kann:
var firstClass = new FirstClass
{
SecondClass = new SecondClass
{
MyString = "Test"
}
};
Die obere Variante ist mir allerdings neu.
Hat jemand für diesen Syntaxzucker ein Schlagwort o.ä. bzw. kann jemand sagen wann das in C# implementiert wurde?
Hallo p!lle,
diese Möglichkeit gab es schon seit Einführung der "object initializer" (C# 3).
Der Ctor von FirstClass
erzeugt SecondClass
und im Objekt-Initialisierer wird dann nur mehr die Eigenschaft MyString
vom bereits instanziierten Typ SecondClass
gesetzt. Genauso wie du selbst geschrieben hast. Ohne Ctor, der SecondClass
erzeugt, gibt es eben die NRE.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Hmm, okay. 😁
Ist mir tatsächlich bis vorgestern noch nie aufgefallen, vor allem die Schreibweise hat mich irritiert.
Aber gut zu wissen, dass es sowas gibt. 👍
Hallo p!lle,
😁
in den letzten C#-Versionen hat sich bei den "Collection Initializern" auch etwas geändert, z.B. dass
var numbers = new Dictionary<int, string> {
[7] = "seven",
[9] = "nine",
[13] = "thirteen"
};
(Quelle)
möglich ist.
Der generierte Code ist dabei ganz interessant (ILSpy, etc. -- entweder direkt das IL anschauen od. eine alte C#-Version einstellen, so dass gesehen werden kann was hinter den Kulissen generiert wird). So lassen sich dann auch Einsatzmöglichkeiten / potentielle Fehler besser ausloten.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"