C#の「=>」構文はどういう意味ですか?


84

このフォーラムのいくつかの質問でこの構文に出くわしましたが、Googleや他の検索エンジンは検索で文字と数字以外のものをブロックする傾向があるため、「=>」を検索することはできません。

それで、誰かがそれが何であるか、そしてそれがどのように使われるかを教えてもらえますか?


回答:


86

これはラムダ演算子です。

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();

参照:

(そして実際に多くの同様の質問-ラムダタグラムダ式タグを試してください。)


1
質問は質問されている正確なケースについて何も述べていないので、おそらくこの回答を更新して、新しい式の本体メンバーの構文も含めることを検討してください。
Lasse V. Karlsen 2016

1
ニース:)この質問は重複クロージングのターゲットとして使用されたため、ここに来たばかりなので、他の場合に別の質問を探すのではなく、1つの答えがあるといいと思いました:)
Lasse V. Karlsen

15

これは、メソッド表記のはるかに簡潔な形式です。以下はほぼ同等です。

// 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宣言され、次にそのタイプのデリゲート参照が宣言され、署名が一致する匿名メソッドが割り当てられます。


14

それは素晴らしさを意味します。例えば

x => x + 1

xをパラメーターとして受け取り、その後継を返すメソッドを表します。

button.Click += new EventHandler((sender, e) => methodInfo.Invoke(null, new object[] { sender, e }));

MethodInfoが保持するメソッドを呼び出すことにより、イベントハンドラーをボタンに割り当てます。


10

これはmsdnからの簡単な例です

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

=>の前はすべて入力パラメーターであり、後はすべて式です。複数の入力パラメーターを持つことができます。ラムダは主にLinqで使用されます。


8

このような匿名メソッドを使用する代わりに:

somevar.Find(delegate(int n)
{
   if(n < 10)
      return n;
});

あなたは単にこのようにそれを書く:

somevar.Find(n => n < 10);

戻り値に基づいてデータ型を取得します。


3

=>トークンは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();
}

4
他のWebサイトから回答をコピーして貼り付ける場合は、少なくともソースへのリンクを含めてください。
Knelis

1

基本的には、パラメータのように「入る」という意味です

MyObjectReference => MyObjectReference.DoSomething()

通常、これらを使用して、関数をパラメーターとしてメソッドに渡すか、LINQステートメントで渡します。

MyCollection.Where(myobj => myobj.Age>10)

例えば。


0

これはラムダ式の構文の一部です。ラムダ式は、基本的にデリゲートまたは無名メソッドの短縮形です。説明のために、アルファベットの文字と一致する文字列の配列があると仮定します。次のLINQ式を使用して、「E」より大きい値を含む配列のメンバーを選択できます。

var someLetters = alphabet.Where(l => l> "E");

「=>」の左側のラムダ式の部分は、テストの変数名(アルファベットの個々のメンバーに設定されます)を識別し、「=>」の右側のラムダ式の部分は、処理。この場合、処理によってブール値が生成され、Whereロジックは、アルファベットの各メンバーがsomeLetters配列に渡されるかどうかを判別するために使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.