2009-02-22 5 views
6

이 문장의 '=>'은 무엇을 의미합니까?연산자 '=>'는 C#에서 무엇을 의미합니까?

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

위의 선언은이 내용과 동일합니까?

del = new SomeDelegate(this.SomeAction); 

감사합니다.

+0

" '=>'연산자가 C#에서 의미하는 것은 무엇입니까?"와 같이 질문에 대해 더 자세한 제목을 사용해야합니다. 오히려 "C# delegate question" –

+0

감사합니다. 나는 더 잘 설명하려고 노력할 것입니다. – Krakerjak

답변

7

기본적으로 SomeAction을 호출하는 매개 변수를 사용하지 않는 익명의 함수를 지정합니다. 그렇습니다. 기능적으로 동일합니다. 같지 않아. 도움이

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

희망 :

del = new SomeDelegate(this.CallSomeAction); 

CallSomeAction는 다음과 같이 정의된다 : 람다를 사용하면 더 많은 것과 같습니다!

+0

그렇다면 '=>'는 람다를 의미합니까? 하나의 장점은 다른 것보다 무엇입니까? – Krakerjak

+1

장점은 주로 간결하고 가독성이 뛰어난 것입니다. :) – mletterle

4

do "() => ..."구문은 람다 식이라고하며 익명 함수와 동일합니다. 아마도 델리게이트 부분을 생략하고 컴파일러에서 델리게이트 유형을 추측하도록 할 수 있습니다.

del = this.SomeAction; 

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

등에서 (항목의 유형 푸 여기서 모든 항목을 찾을 수) 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); 

사실,이 컴파일러는 우리를 위해 않습니다 정확히 꽤-많이 (모두 "위임"및 람다 사용을 위해). 가장 큰 차이점은 람다가 인 경우 Expression을 나타낼 수 있다는 것입니다 (예 : LINQ).

관련 문제