このフォーラムのいくつかの質問でこの構文に出くわしましたが、Googleや他の検索エンジンは検索で文字と数字以外のものをブロックする傾向があるため、「=>」を検索することはできません。
それで、誰かがそれが何であるか、そしてそれがどのように使われるかを教えてもらえますか?
回答:
これはラムダ演算子です。
C#3からC#5まで、これはラムダ式にのみ使用されていました。これらは基本的にC#2で導入された匿名メソッドの短い形式ですが、式ツリーに変換することもできます。
例として:
Func<Person, string> nameProjection = p => p.Name;
と同等です:
Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };
どちらの場合も、Personパラメーターを使用してデリゲートを作成し、その人の名前を(文字列として)返します。
C#6では、式本体のメンバーに同じ構文が使用されます。
// Expression-bodied property
public int IsValid => name != null && id != -1;
// Expression-bodied method
public int GetHashCode() => id.GetHashCode();
参照:
これは、メソッド表記のはるかに簡潔な形式です。以下はほぼ同等です。
// explicit method
int MyFunc(int pParam) {
return pParam;
}
// anonymous (name-less) method
// note that the method is "wrapped" up in a hidden object (Delegate) this way
// so there is a very tiny bit of overhead compared to an explicit method
// (though it's really the assignment that causes that and would also happen
// if you assigned an explicit method to a reference)
Func<int, int> MyFunc = delegate (int pParam) { return pParam; };
// lambda expression (also anonymous)
// basically identical to anonymous method,
// except with everything inferred as much as possible, intended to be minimally verbose
Func<int, int> MyFunc = x => x;
// and => is now also used for "expression-bodied" methods
// which let you omit the return keyword and braces if you can evaluate
// to something in one line
int MyFunc(int pParam) =>
pParam;
ラムダ式は、「何かを与えられたら、何かを返す」と言っていると考えてください。上記の例では、ラムダ式x => xは「given x、return x」と言っていますが、ラムダ式は必ずしも何かを返す必要はありません。その場合、「given x、dosomethingwithx」と読むことができます。
また、最初は非常に混乱する可能性がある「委任」と呼ばれる3つのものがあることに注意してください。
匿名メソッドはdelegateキーワードを使用しますが、名前のないメソッドを定義します。
Func<int, int> = delegate (int x) { return x; };
メソッド(匿名、明示的、またはラムダ)を参照に割り当てると、非表示のDelegateラッパーオブジェクトが作成され、メソッドを参照できるようになります。(基本的には一種の「マネージ関数ポインタ」です。)
次に、キーワードを使用して名前付きメソッドのシグネチャを宣言することもできdelegateます。
public delegate int TestFunc(int x, int y);
TestFunc myFunc = delegate (int x, int y) { return x + y; };
これTestFuncは、2つかかる名前付き署名を宣言しますintのs、を返すint宣言され、次にそのタイプのデリゲート参照が宣言され、署名が一致する匿名メソッドが割り当てられます。
=>トークンは2つの形式でサポートされていますようにラムダオペレータとしてセパレータメンバー名および発現本体定義のメンバの実装。
ラムダ演算子
ラムダ式では、ラムダ演算子=>は、左側の入力変数を右側のラムダ本体から分離します。
次の例では、メソッド構文でLINQ機能を使用して、ラムダ式の使用法を示しています。
string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
.Where(w => w.StartsWith("a"))
.Min(w => w.Length);
Console.WriteLine(minimalLength); // output: 5
式本体の定義
式本体の定義の一般的な構文は次のとおりです。
member => expression;
ここで、expressionは有効な式です。式は、メンバーの戻り値の型がvoidの場合、またはメンバーがコンストラクター、ファイナライザー、またはプロパティセットアクセサーである場合にのみステートメント式になることができることに注意してください。
次の例は、Person.ToStringメソッドの式本体の定義を示しています。
public override string ToString() => $"{fname} {lname}".Trim();
これは、次のメソッド定義の省略形です。
public override string ToString()
{
return $"{fname} {lname}".Trim();
}
これはラムダ式の構文の一部です。ラムダ式は、基本的にデリゲートまたは無名メソッドの短縮形です。説明のために、アルファベットの文字と一致する文字列の配列があると仮定します。次のLINQ式を使用して、「E」より大きい値を含む配列のメンバーを選択できます。
var someLetters = alphabet.Where(l => l> "E");
「=>」の左側のラムダ式の部分は、テストの変数名(アルファベットの個々のメンバーに設定されます)を識別し、「=>」の右側のラムダ式の部分は、処理。この場合、処理によってブール値が生成され、Whereロジックは、アルファベットの各メンバーがsomeLetters配列に渡されるかどうかを判別するために使用します。