Laden...

[Erledigt] Name für Syntaxzucker: erweiterter Objektinitialisierer

Erstellt von p!lle vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.287 Views
p!lle Themenstarter:in
1.040 Beiträge seit 2007
vor 5 Jahren
[Erledigt] Name für Syntaxzucker: erweiterter Objektinitialisierer

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?

6.911 Beiträge seit 2009
vor 5 Jahren

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!"

p!lle Themenstarter:in
1.040 Beiträge seit 2007
vor 5 Jahren

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. 👍

6.911 Beiträge seit 2009
vor 5 Jahren

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!"