2009-02-22 28 views
6

このステートメントの '=>'は何を表していますか?演算子 '=>'はC#でどういう意味ですか?

del = new SomeDelegate(() => SomeAction()); 

上記の宣言はこれと同じですか?

del = new SomeDelegate(this.SomeAction); 

ありがとうございます。

+0

「C =で '= ='演算子が意味するものは何ですか?」など、よりわかりやすいタイトルを使用する必要があります。 "C#delegate question"よりむしろ –

+0

ありがとう、私はより説明的にしようとします。 – Krakerjak

答えて

7

基本的には、SomeActionを呼び出すパラメータを持たない無名関数を指定しています。はい、機能的に同等です。平等ではありません。 CallSomeActionが定義されている

del = new SomeDelegate(this.CallSomeAction); 

public void CallSomeAction() 
{ 
    this.SomeAction(); 
} 

役に立てば幸いラムダを使用することにより等価です!

+0

だから '=>'はラムダを意味するのでしょうか?どちらが他のものより優れているのでしょうか? – Krakerjak

+1

利点は主に簡潔さと可読性の1つです:) – mletterle

4

do "()=> ..."構文はラムダ式と呼ばれ、無名関数と同じものです。おそらく、デリゲートの部分を省略して、コンパイラにデリゲートの型を推測させるだけです。

"del"がどのようなタイプのものであるかによって異なります。まず第ラムダまたは匿名メソッドまたは普通の方法を使用して

編集

は、デリゲートにデリゲートの署名を持っていなかった方法をマッピングすることができます。

たとえば、bool myDelegate(int、int)というシグネチャを持つデリゲートがあり、bool myMethod(string、string)というシグネチャを持つメソッドをデリゲートを処理したいとします。ラムダ式を使用すると、このような短い構文でインラインで行うことができます。

delegate bool myDelegate(int x, int y); 

// With lambdas... 
myDelegate del = (int a, int b) => myMethod(a.ToString(), b.ToString()); 

// With anonymous methods... 
myDelegate del2 = delegate(int a, int b) { return myMethod(a.ToString(), b.ToString()); }; 

// The good ol' way without lambdas or anonymous methods... 
myDelegate del3 = SomeDelegateHandler; 

... then write a method somewhere else ... 

// Handler method 
private bool SomeDelegateHandler(int a, int b) 
{ 
    return myMethod(a.ToString(), b.ToString()); 
} 

だから、ラムダと匿名メソッドは、デリゲートを処理するための方法を作るだけの短い/インライン方法基本的に見ることができるように。あなたの場合、余分な方法を作る必要はないでしょう。デリゲートのシグネチャがメソッドのシグネチャと同じであるかどうかによって異なりますが、私の場合はそうだと思われます。

2

=>Lambda Operatorであり、ラムダ式はC#2.0 anonymous methodsの進化のようなものです。ラムダ式を使用して

Func<string,int> wordCount; 
wordCount = delegate (string text) { return text.Split().Length; }; 
Console.WriteLine (wordCount("Hello World")); 

あなたは、デリゲートのインスタンスを作成するために非常によく似た方法で、匿名メソッドとラムダ式を使用することができます

Func<string,int> wordCount; 
wordCount = (string text) => { text.Split().Length; }; 
Console.WriteLine (wordCount("Hello World")); 
4

は「=>」「読むことができます行きますto "(source: Eric Lippert)、ラムダ式の演算から引数を単離します。この場合、ラムダは過剰です。より良い例は次のようになります。

var subList = list.FindAll(item => item.Type == "Foo"); 

(アイテムのタイプはFooのあるすべてのアイテムを見つける。)

などでC#2.0、これも書くことができます。

var subList = list.FindAll(delegate(SomeType item) { 
    return item.Type == "Foo";}); 

かつ迅速です表現方法は関数「インライン」であり、「クロージャー」サポートも提供します。つまり、次のようにすることもできます。

string itemType = ... 
var subList = list.FindAll(item => item.Type == itemType); 

To項目型を渡す型definitonを必要とするそれ以外の場合は、この操作を行います。

class Searcher { 
    public string itemType; 
    public bool Find(SomeType item) {return item.Type == itemType;} 
} 
... 
Searcher searcher = new Searcher(); 
searcher.itemType = ... 
var subList = list.FindAll(searcher.Find); 

実際には、これはコンパイラが私たちのためにまったく同じものをかなり-くらいです(両方とも「デリゲート」とラムダを使用するため)。最大の違いは、ラムダはでもと表現できます。たとえばLINQの場合はExpressionとなります。

関連する問題