Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

[Erledigt] Name für Syntaxzucker: erweiterter Objektinitialisierer
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1052

Themenstarter:

[Erledigt] Name für Syntaxzucker: erweiterter Objektinitialisierer

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von p!lle am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7510
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1052

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7510
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers