web-dev-qa-db-ja.com

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

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

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

72
Wolf5

ラムダ演算子です。

C#3からC#5まで、これは lambda式 にのみ使用されました。これらは基本的に、C#2で導入された 匿名メソッド の短い形式ですが、 式ツリー に変換することもできます。

例として:

Func<Person, string> nameProjection = p => p.Name;

以下と同等です:

Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };

どちらの場合も、Personパラメータを使用してデリゲートを作成し、その人の名前を(文字列として)返します。

C#6では、同じ構文がexpression-bodyed membersに使用されます。

// Expression-bodied property
public int IsValid => name != null && id != -1;

// Expression-bodied method
public int GetHashCode() => id.GetHashCode();

こちらもご覧ください:

(実際、多くの同様の質問- lambda および lambda-expressions タグを試してください。)

78
Jon Skeet

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

x => x + 1

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

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

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

15
Serhat Ozgel

関数表記の別の形式です。以下はほぼ同等です。

// explicit function
int MyFunc(int pParam)
{
   return pParam;
}

// delegate function
Func<int, int> MyFunc = delegate(int pParam) { return pParam; };

// lambda expression
Func<int, int> MyFunc = x => x;

ラムダ式は、「何かを与え、何かを返す」と言っていると考えてください。上記の例では、関数x => xは「xを指定し、xを返す」と言います。 (ラムダ式は必ずしも何かを返す必要はありませんが、その場合、「与えられたx、xで何かをする」と読むかもしれません。)

11
Dave Cousineau

ここにmsdnからの簡単な例があります

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

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

8
Steve

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

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

次のように書くだけです:

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

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

6
milot

=>トークンは、2つの形式でサポートされます:メンバー名と式のメンバー実装のlambda operatorseparatorとしてボディ定義。

ラムダ演算子

ラムダ式では、ラムダ演算子=>は、左側の入力変数を右側のラムダ本体から分離します。

次の例では、メソッド構文で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();
}
0
user734862

基本的には、パラメータのように「入る」ことを意味します

MyObjectReference => MyObjectReference.DoSomething()

通常、関数をパラメーターとして、またはLINQステートメントでメソッドに渡すために使用します

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

例えば。

0
qui

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

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

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

0
JonStonecash