表現力のあるメンバーを使用するのはいつが適切ですか?[閉まっている]


24

C#6では、式の結果を返すメソッドとプロパティのコードを簡略化できる、式を使用したメンバーが導入されています。

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

になる:

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

現在、2つの完全に同等で有効な構文があるため、どちらを使用するかを決定するために、ある程度の経験則を使用する必要があります。新しい選択肢はいつ適切ですか?


7
ええと、メンバーの体が表現であるとき?
ヨルグWミットタグ

1
それは、「いつからだを表現したメンバーを使用できるか」という質問に答えるでしょう。
-Asik

7
完全に関連しているわけではありませんが、使用できませんpublic override string ToString() => $"{_field1} {_field2}";か?
タオデン

3
@JorgWMittag「...副作用がない」を追加します。純粋に機能的ではない場合に、機能的スタイルでメソッドを宣言することは誤解を招く可能性があります。
ジュール

回答:


12

関数型プログラミング言語は式のみで構成されているため、ほとんどの場合、基本的に最初からこのような機能があります。比較的短く、頻繁に繰り返される表現があり、さらに短く、より意味のある名前に置き換えることができる場合に使用します。

一般的な例は、次のような他の場所で使用される述語です。

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

式が長すぎる場合は、別の関数に分割するか、名前付きの中間結果を持つ1つの関数に分割することをお勧めします。短いが、良い名前が思いつかない場合は、ひどい名前などを作成するよりも、単に表現をコピーする方が良いでしょcondition1う。


21

C#/。NETリトル七不思議:C#6で表現ボディメンバー

それで、あなたはこれを使うべきですか?それはすべてスタイルに帰着します。私の意志は、これを一見して明確に理解できる単純な表現と文限定することです。

(強調、私の。以下の更新1を参照)

上記の記事の概要からの詳細:

そのため、C#6では式でget-onlyプロパティとメソッドボディを指定できるようになりました。これにより、コードをより簡潔にするための非常に単純なメソッドの構文負担を軽減できます。

ただし、すべてのことを考慮して、特定の状況に適合するかどうかを判断してください。式が非常に長いか複雑な場合でも、完全なボディ構文を使用すると読みやすくなります。

また、パフォーマンスに関する別の引用もあります。これは、特定の言語機能を使用することが適切な場合にパフォーマンスの問題が発生する可能性があるためです。

今、あなたは尋ねることができますが、これは実行時にパフォーマンスに影響を及ぼしますか?実際、答えは「いいえ」です。これは、完全な本文を書くのと同じILに展開される単純な構文上の砂糖です。それはないではない、それは単に発現をもたらすシンプルなボディを書いて簡素化するため、ラムダ式の構文を借りている、デリゲートを作成します。

(強調、著者)

更新1: @JörgWMittagによると

これは意味がありません。「これを単純な式と文に限定する」?え?式でのみ、ステートメントでも機能します!

元の作者が間違えた可能性があります。明確にするために、新しく改善されたC#6.0から

式本体関数は、C#6.0の別の構文簡略化です。これらは、ステートメント本体のない関数です。代わりに、関数宣言に続く式でそれらを実装します。

明確にするために、これはメソッドまたはプロパティをExpressionにしない。Expression 構文を使用して、コード行(および中括弧の数)を削減します。

私の元々の推奨事項は今でも有効です。使用できるからという理由だけでなく、コードをわかりやすく理解しやすくするときに使用してください。


2
これは意味がありません。「これを単純な式と文に限定する」?え?式のみで、ステートメントでも機能します!また混乱(2つの括弧と1つのreturnキーワード)を追加すると読みやすくなるとは思いません。結局のところ、複雑な式はまったく同じ複雑な式であり、構文の混乱に埋もれているだけです。
ヨルグWミッター

3
私が表現を読んだことから、メンバーは実際には表現ではありません。それらは構文糖です。ブログの投稿以降、C#の仕様が変更されていない限り、C#の仕様ではvoid戻り値型のメソッドがサポートされています。
グレッグブルクハート

1
私は間違っている可能性がありますが、式ステートメントでは副作用は許可されていないと思います。私にとって、式ステートメントの利点は、この「式」が純粋であり、読者であるあなたが探す必要のある隠れた副作用がないことを読者に伝えることです。
ジョン

1
「許可されていない」@Johnは完全に間違っています。アクション宣言セットのメンバー変数内で、アクションの作成などのすべての方法を実行してから、アクションを呼び出すことができます。したがって、副作用は明らかに禁止されていません。私は間違いなくそれらを落胆させるでしょう、彼らは表現構文のポイントを見逃しています。
マフィイ

@Mafii。ありがとう。それ以来、「モダン」と表現された「表現ステートメント」を実行できることを学びました。しかし、私にとっては、まさにその考えは紛らわしいです。
ジョン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.