Wann ist es angebracht, ausdrucksstarke Mitglieder zu verwenden? [geschlossen]

24

C # 6 führt Member mit Ausdruck ein, die vereinfachten Code in Methoden und Eigenschaften ermöglichen, die nur das Ergebnis eines Ausdrucks zurückgeben:

public override string ToString()
{
     return string.Format("{0} {1}", _field1, _field2);
}

wird:

public override string ToString() =>
    string.Format("{0} {1}", _field1, _field2);

Da wir jetzt zwei genau äquivalente und gültige Syntaxen haben, muss eine Faustregel verwendet werden, um zu entscheiden, welche verwendet werden soll. Wann ist die neue Alternative angebracht?

Asik
quelle
7
Ähm, wenn der Körper des Mitglieds ein Ausdruck ist?
Jörg W Mittag
1
Das würde die Frage beantworten, "wann es möglich ist, ausdrucksstarke Mitglieder zu verwenden".
Asik
7
Nicht vollständig verwandt, aber können Sie nicht verwenden public override string ToString() => $"{_field1} {_field2}";?
Thaoden
3
@JorgWMittag Ich würde hinzufügen "... das hat keine Nebenwirkungen". Es wäre irreführend, eine Methode in einem funktionalen Stil zu deklarieren, wenn sie nicht rein funktional ist.
Jules

Antworten:

12

Funktionale Programmiersprachen bestehen nur aus Ausdrücken, daher hatten die meisten von Anfang an eine Funktion wie diese. Sie verwenden es, wenn Sie einen relativ kurzen, häufig wiederholten Ausdruck haben, der durch einen noch kürzeren, viel aussagekräftigeren Namen ersetzt werden kann.

Ein häufiges Beispiel wären Prädikate, die an anderer Stelle verwendet werden, z.

public static bool isOdd(int num) => (num % 2) == 1;

Wenn der Ausdruck zu lang ist, ist es besser, ihn in separate Funktionen oder eine Funktion mit benannten Zwischenergebnissen aufzuteilen. Wenn es kurz ist, aber Ihnen kein guter Name einfällt, ist es besser, nur den Ausdruck zu kopieren, als einen schrecklichen Namen wie condition1oder so zu kreieren .

Karl Bielefeldt
quelle
21

Aus C # /. NET Little Wonders: Ausdrucksstarke Mitglieder in C # 6 :

Solltest du das also benutzen? Auf den Stil kommt es an. Ich würde mich darauf beschränken, einfache Ausdrücke und Aussagen zu verwenden, die auf den ersten Blick klar zu verstehen sind.

(Hervorhebung, meine; siehe Update 1 unten)

Mehr aus der Zusammenfassung des Artikels oben:

C # 6 gibt uns jetzt die Möglichkeit, Nur-Get-Eigenschaften und Methodenkörper mit Ausdrücken anzugeben. Dies kann dazu beitragen, die Syntaxlast sehr einfacher Methoden zu verringern, um den Code übersichtlicher zu gestalten.

Verwenden Sie jedoch bei allen Dingen Ihr Urteil, ob es für eine bestimmte Situation geeignet ist. Wenn ein Ausdruck sehr lang oder komplex ist, ist die Verwendung der Ganzkörpersyntax möglicherweise noch besser lesbar.

Und noch ein Zitat zur Leistung, denn Leistungsprobleme können auch auftreten, wenn es angebracht ist, eine bestimmte Sprachfunktion zu verwenden:

Nun fragen Sie sich vielleicht, ob dies Auswirkungen auf die Leistung zur Laufzeit hat. Eigentlich lautet die Antwort nein . Dies ist einfach syntaktischer Zucker, der sich in dieselbe IL ausdehnt wie das Schreiben des gesamten Körpers. Es wird kein Delegat erstellt, sondern lediglich die Lambda-Ausdruckssyntax ausgeliehen, um das Schreiben einfacher Körper zu vereinfachen, die zu einem Ausdruck führen.

(Hervorhebung des Autors)

Update 1: @ JörgWMittag sagte

Das macht keinen Sinn. "Beschränken Sie dies auf einfache Ausdrücke und Anweisungen"? Huh? Es funktioniert nicht einmal mit Anweisungen, nur mit Ausdrücken!

Es scheint, dass der ursprüngliche Autor möglicherweise einen Tippfehler hat. Zur Verdeutlichung aus dem neuen und verbesserten C # 6.0 :

Funktionen mit Ausdruckscharakter sind eine weitere Vereinfachung der Syntax in C # 6.0. Dies sind Funktionen ohne Anweisungstext. Stattdessen implementieren Sie sie mit einem Ausdruck, der der Funktionsdeklaration folgt.

Dies macht eine Methode oder Eigenschaft nicht zu einem Ausdruck . Es verwendet die Expression- Syntax , um die Codezeilen (und die Anzahl der geschweiften Klammern) zu reduzieren.

Meine ursprüngliche Empfehlung lautet nach wie vor: Verwenden Sie sie, wenn Ihr Code dadurch klarer und verständlicher wird, und nicht nur, weil Sie ihn verwenden können.

Greg Burghardt
quelle
2
Das macht keinen Sinn. "Beschränken Sie dies auf einfache Ausdrücke und Anweisungen "? Huh? Es spielt keine‘sogar Arbeit mit Aussagen, nur mit Ausdrücken! Ich bin auch nicht davon überzeugt, dass das Hinzufügen von Unordnung (zwei Klammern und ein returnSchlüsselwort) jemals zu mehr Lesbarkeit führen kann. Immerhin ist der komplexe Ausdruck immer noch genau derselbe komplexe Ausdruck, der nur in syntaktischer Unordnung begraben ist.
Jörg W Mittag
3
Nach dem, was ich gelesen habe, sind körperbehaftete Mitglieder eigentlich keine Ausdrücke. Sie sind syntaktischer Zucker. Sofern sich die C # -Spezifikation seit dem Blogeintrag nicht geändert hat, werden Methoden mit ungültigen Rückgabetypen unterstützt.
Greg Burghardt
1
Ich könnte mich irren, aber ich glaube, dass Nebenwirkungen in Ausdrucksanweisungen nicht zulässig sind. Für mich besteht der Vorteil von Ausdrucksanweisungen darin, dass Sie dem Leser sagen, dass dieser "Ausdruck" rein ist und dass es keine versteckten Nebenwirkungen gibt, nach denen Sie als Leser suchen müssen.
John
1
@ John "nicht erlaubt" ist völlig falsch. Sie können alle Shenanigans wie das Erstellen einer Aktion ausführen, indem Sie in der Aktionsdeklaration Membervariablen festlegen und dann die Aktion aufrufen. Daher sind Nebenwirkungen offensichtlich nicht unzulässig. Ich würde sie definitiv entmutigen, da sie den Sinn der Ausdruckssyntax verfehlen.
Mafii
@ Mafii. Vielen Dank. Ich habe seitdem gelernt, dass man "Ausdrucksaussagen" machen kann, die als "modern" beschrieben wurden. Für mich ist die Idee jedoch nur verwirrend.
John