2015-01-27 11 views
9

die neuen Expression-Bodied Mitglieder mithilfe der Funktion in C# 6.0, können wir eine Methode wie folgt nehmen:Warum können wir keine ausdrucksbasierten Konstruktoren verwenden?

public void Open() 
{ 
    Console.WriteLine("Opened"); 
} 

... und es auf einen einfachen Ausdruck mit äquivalenter Funktionalität ändern:

public void Open() => Console.WriteLine("Opened"); 

Dies gilt jedoch nicht für Konstrukteure. Code wie diese nicht kompiliert:

private DbManager() => Console.WriteLine("ctor"); 

auch nicht dies:

private DbManager() => {} 

Gibt es einen Grund, warum Konstrukteure aus den Expression-bodied Mitgliedern verfügen können nicht profitieren, und muss die traditionelle Art und Weise erklärt werden ?

+0

ich nur eine * Vermutung hier * zur Verfügung stellen kann ... im Grunde wesentlich für Konstrukteure weniger nützlich sie sind, und das Hauptgehäuse Verwendung für die Expression-bodied Mitglieder ist, wo sie * Rückgabe * etwas, während Sie in einem Konstruktor nichts zurückgeben. Beachten Sie, dass Ihr letztes Beispiel länger ist als nur den Code * ohne * das '=>' zu schreiben. –

+0

Es gab einige Experimente um Konstruktoren, die für C# 6.0 aufgegeben wurden. Es gibt einige weitere Funktionen, die für C# 7.0 mit Konstruktoren geplant wurden, und es gab eine Entscheidung, diesmal nichts an Konstruktoren zu ändern. –

Antwort

14

Es wäre verwirrender als nützlich. Vor allem, wenn Sie einem anderen Konstruktor einen Aufruf hinzufügen.

Hier ist das direkte Zitat aus dem Konstruktionshinweis:

Konstrukteurs haben syntaktische Elemente in der Kopfzeile in Form dieses (...) oder Base (...) initializers, das kurz vor einem dicken Pfeil seltsam aussehen würde. Noch wichtiger ist, dass Konstruktoren fast immer seiteneffektive Anweisungen sind und keinen Wert zurückgeben.

Von C# Design Notes for Nov 4, 2013

In einer allgemeineren Weise:

Zusammengefasst Ausdruck Körper auf Methoden und benutzerdefinierten Operatoren (einschließlich Umwandlungen) erlaubt, wo sie den Wert aus der zurück auszudrücken Funktion und auf Eigenschaften und Indexer, wo sie den Wert ausdrücken, der vom Getter zurückgegeben wird, und die Abwesenheit eines Setter implizieren.

3

Nun, da die C# 7.0 veröffentlicht wurde, können ausdrucksbasierte Konstruktoren verwendet werden.

private DbManager() => Console.WriteLine("ctor"); 

funktioniert gut in C# 7.0

+1

Danke fürs Teilen! Es wäre schön zu wissen, dass das C# -Team die in der angenommenen Antwort genannten Herausforderungen gemeistert hat. – Gigi

+0

@Gigi Sie waren nie technische Herausforderungen. Das Argument war, dass sie "vor einem dicken Pfeil seltsam aussehen würden". – Neme

Verwandte Themen