2008-09-19 4 views
11

람다 식 (인라인 코드)과 같은 새로운 기능의 등장으로 더 이상 대리자 또는 익명 메서드를 사용하지 않아도된다는 의미입니까? 필자가 보았던 거의 모든 샘플에서 새로운 구문을 사용하여 다시 작성합니다.익명 메서드에 대해 람다 식보다 대리자 구문이 선호되는 경우가 있습니까?

대리자와 람다 식을 사용해야하는 곳은 작동하지 않습니다.

+0

참조 [뭐죠 - 더 차분 간 익명 방법 및 람다 표현식 (http://stackoverflow.com/questions/208381/whats-the-difference-between-anonymous-methods-c -2-0 및 λ 식)을 사용합니다. – nawfal

답변

8

lambda는 익명 대리자의 바로 가기이지만 항상 위임자를 사용합니다. 대리자는 메서드 서명을 지정합니다. 그냥이 작업을 수행 할 수 있습니다

delegate(int i) { Console.WriteLine(i.ToString()) } 

f => Console.WriteLine(f.ToString()) 
3

람다 표현식으로 대체 될 수있는 것은 바로 "문법 설탕", 컴파일러는 당신을 위해 적절한 대표를 생성 할 수 있습니다. Lutz Roeder의 반사경을 사용하여이를 조사 할 수 있습니다.

+1

사실 람다 식은 표현식 트리로 컴파일되어 조작 될 수 있기 때문에 문법적 설탕보다 조금 더 있습니다. –

+0

리플 렉터는 현재 redgate가 소유하고 있습니다. [http://www.red-gate.com/products/reflector/] – cori

3

람다의 사용하면 다음 작업을 수행 할 수 있습니다, 그들은 단지 인라인하지, 명 규모의 단지 문법 설탕 있습니다 :

s.Find(a => 
{ 
    if (a.StartsWith("H")) 
     return a.Equals("HI"); 
    else 
     return !a.Equals("FOO"); 
}); 

그리고 이벤트를 정의 할 때 또는 대의원이 여전히 사용된다 당신은 인자를 많이 가지고 싶을 때 실제로 강하게 호출되는 메서드를 입력하십시오.

27

예 익명 대리자와 람다 식을 직접 사용하는 곳은 없습니다.

메서드가 형식화되지 않은 대리자를 사용하면 컴파일러에서 익명 대리자/람다 식을 해결할 대상을 알 수 없으므로 컴파일러 오류가 발생합니다. 코드의

public static void Invoke(Delegate d) 
{ 
    d.DynamicInvoke(); 
} 

static void Main(string[] args) 
{ 
    // fails 
    Invoke(() => Console.WriteLine("Test")); 

    // works 
    Invoke(new Action(() => Console.WriteLine("Test"))); 

    Console.ReadKey(); 
} 

실패한 라인은 컴파일러 오류가 "그것은 대리자 형식이 아니기 때문에 'System.Delegate'을 입력 람다 식을 변환 할 수 없습니다"얻을 것이다.

+0

저는 질문자가 새로운 델타 기반 구문에 찬성하여 'delegate' 키워드에 대해 묻고 있다고 생각합니다. 그녀는 "익명의 방법과 위임"을 그룹화합니다. – nawfal

3

대리인은 C#에서 두 가지 의미가 있습니다.

키워드 delegate을 사용하여 함수 서명 유형을 정의 할 수 있습니다. 이것은 대개 고차 함수의 서명, 즉 다른 함수를 인수로 취하는 함수를 정의 할 때 사용됩니다. 이 위임자의 사용은 여전히 ​​적합합니다.

delegate 키워드는 인라인 익명 기능을 정의하는 데 사용할 수도 있습니다. 함수가 단일 표현식 인 경우에는 람다 구문이 더 간단한 대안입니다.

7

람다 식은 대리자를 대체하는 (숨기기) 은색 총알이 아니며 (의도하지도 않았습니다).

List<string> names = GetNames(); 
names.ForEach(Console.WriteLine); 
  1. 은 이해하기가 코드를 더함으로써 읽을 간단합니다 : 그것은 같은 작은 지역 것들로 아주 좋습니다.
  2. 그것은 짧은 코드 우리를 위해 이렇게 적은 작업을한다, 반면에)

은 그들을 오용하는 것은 매우 간단합니다.긴 및/또는 복잡한 람다 표현식이 될 경향이있다 :

새로운 개발자를 위해 이해하기 하드
  1. 더 힘들어

을 읽을 지향

  • 적은 개체가 그래서 "는 의미합니까 우리 돈 델리게이트 또는 익명 메소드를 더 이상 사용해야합니까? "아니요 - 시간/가독성을 획득 한 람다 표현식을 사용하지 않는 경우 델리 게이트 사용을 고려하십시오. 이전 delegate 구문

  • +0

    와우! 나는 이것에 대해 결코 두려워하지 않는다! 술어도 할 수 있나요? 즉 names.Where (! string.IsNullOrEmpty)); ? 나는 노력했지만 그것은 나를 위해 작동하지 않습니다. 죄송합니다. 내가 제거하면! 피연산자가 작동합니까? 왜 ??? 나는 심지어 괄호 안에 넣으려고했으나 그것을 완전히 호출 할 수는 없다. 방법이 있을까? 나는 방법 서명에 인수를 지정하지만 메소드 본문에서 사용하지 않을 이유에 우리는 실제로 이른 아침부터 오늘 – Shimmy

    2

    그리 큰 장점은 메소드 본문에서 사용 해달라고하면 당신이 매개 변수를 지정할 필요가 없다는 것입니다. msdn

    에서 익명의 방법은 람다 식에없는 기능 을 제공하는 하나의 경우가 있습니다. 익명 메소드를 사용하면 매개 변수 목록을 생략 할 수 있습니다. 즉, 익명의 메서드는 을 다양한 서명이있는 대리자로 변환 할 수 있습니다. 람다 식에서는 이 아닙니다.

    예를 들어, 당신은 할 수 있습니다 :

    Action<int> a = delegate { }; //takes 1 argument, but not specified on the RHS 
    

    을이 실패하는 동안 :

    button.onClicked += delegate { Console.WriteLine("clicked"); }; 
    

    : 같은 이벤트 핸들러를 작성할 때이 기술은 주로 편리하게 제공

    Action<int> a = => { }; //omitted parameter, doesnt compile. 
    

    이것은 이 아닙니다. 이점. 최신 구문 인 imho를 채택하는 것이 좋습니다.

    +1

    실제로 내가 사용 사례를 찾고 있었다 ... string.IsNotNullOrEmpty에 string.IsNullOrEmpty 변환하려고 :피. 이벤트 핸들러는 예제처럼 보이지만 여전히 _1_입니다. 매개 변수를 생략하면 혼란이 야기됩니다. _2_. 내일'object sender, EventArgs e' 매개 변수 중 하나를 사용할 필요가 생기면 개발자는 명확하지 않은이 특정 컴파일러 트릭을 인식해야합니다. 필자에게 필자는 두 단어의 타이핑을 저장하기 위해 기능적인 관점에서 본다면 엄지 손가락이다. 나는 당신과 강력하게 동의합니다 - 이것은 강한 장점이 아닙니다 _ – RBT

    관련 문제