2009-11-17 4 views
16

익명 메서드와 마찬가지로 "delegate"키워드를 사용하여 선언 한 대리자는 익명 대리자입니까?C# - 익명 대리자

namespace Test 
{ 
    public delegate void MyDelegate(); 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DelegateTest tst = new DelegateTest(); 
      tst.Chaining(); 
      Console.ReadKey(true); 
     } 
    } 

    class DelegateTest 
    { 
     public event MyDelegate del; 

     public void Chaining() 
     { 
      del += delegate { Console.WriteLine("Hello World"); }; 
      del += delegate { Console.WriteLine("Good Things"); }; 
      del += delegate { Console.WriteLine("Wonderful World"); }; 
      del(); 
     } 
    } 
} 

답변

19

예제의 위임자 컬렉션은 여러 가지 익명 메소드를 가리 킵니다. 대리자는 "단지 메서드 포인터"입니다. 실제 메소드 또는 익명 메소드를 가리키는 지 여부는 중요하지 않습니다.

그들은 익명 메소드 명까지입니다 http://msdn.microsoft.com/en-us/library/0yw3tz5k(VS.80).aspx

2

예. 익명 대리인은 이름으로 직접 참조 할 수 없으므로 delegate(){} 구문을 사용하면 익명입니다.

1

참조하십시오. 이것은 익명 메소드를 만드는 한 방법이며, .NET 2.0 이후부터 사용할 수 있습니다. .NET 3.0을 사용하면 쓰기가 더 간단하지만 동일한 코드로 컴파일되는 람다 식을 사용할 수도 있습니다. 나는 그것이 당신이 "익명의 방법"을 가지고 의미했던 것이라고 생각합니다. 그러나 실제로, 그것들은 하나이며 같은 것입니다.

+0

람다 식과 람다 구문의 익명 메서드는 실제로 같지 않습니다. 중괄호로 람다 구문을 사용하는 경우 진술은 true입니다. (x) => {y();} – Lucero

4

맞습니다. 이벤트에 많은 익명 메소드를 할당했습니다.

새 버전의 C#을 사용하는 경우 lambdas와 비슷한 기능을 수행 할 수도 있습니다. 예를 들어 :

class DelegateTest 
{ 
    public event Action del; 

    public void Chaining() 
    { 
     del +=() => Console.WriteLine("Hello World"); 
     del +=() => Console.WriteLine("Good Things"); 
     del +=() => Console.WriteLine("Wonderful World"); 
     del(); 
    } 
} 
+2

C# 3.0을 의미합니까? – user160677

23

에 "익명의 위임"같은 것은 없다 (또는 오히려, 그는 C# 사양의 인정 기간, 또는 제가 알고 다른 .NET 관련 사양이 아니다).

익명 메서드 및 람다 식을 포함하는 익명 함수가 있습니다.

코드는 일반 낡은 익명 메소드를 보여줍니다. 이지만 람다 식에서는 가질 수없는 하나의 기능을 사용합니다. 매개 변수를 신경 쓰지 않으면 매개 변수를 전혀 표시하지 않는 기능입니다.

+0

음. 당신은 이것을 명확히 할 수 있습니까? 우리는 일반적으로 MSDN에서 사용되는 "익명 메소드"라는 용어가 사용되는 모든 곳에서 "익명의 위임자"라는 용어를 사용합니다. 따라서 이전 또는 둘 다 올바르다 고 잘못 말한 것입니다 .. –

+0

@Shekhar_Pro : "익명 방법 "은 정확합니다. "익명 대리자"가 잘못되었습니다. 당신은 "일반적으로 어디에서나 볼 수 있습니다"라고 말하면서 - 특정 장소를 인용 할 수 있습니까? –

+0

공식 문서에는 없지만 네티즌들이 일반적으로 사용하는 용어. 마치 ... 그 자체 .. http://stackoverflow.com/search?q=anonymous+delegate .... 그래서 우리는 틀린 용어를 사용하는 습관에 빠진 것처럼 보입니다. –

2

대리인은 익명으로 취급되지 않습니다. MyDelegate라고합니다. CLR의 델리게이트는 System.MulticastDelegate에서 파생되는 클래스이며 MyDelegate라고합니다. MulticastDelegate에서 직접 파생 할 수는 없지만 C# 컴파일러가 중단합니다.

del에 대리자를 할당 할 때 del을 MyDelegate 형식의 이벤트로 선언했기 때문에 델리게이트의 형식/이름은 컴파일러에서 유추됩니다.