2009-12-27 16 views
5

는 요즘 HttpWebRequest들과 함께 놀았 던, 그리고 튜토리얼에 그들은 항상 :C# 새로운 [대리인] 필요하지 않습니까?

IAsyncResult result = request.BeginGetResponse(
    new AsyncCallback(UpdateItem),state); 

그러나 new AsyncCallback이 모든 necesary 될 것 같지 않습니다. UpdateItem에 올바른 서명이있는 경우 문제가없는 것 같습니다. 그렇다면 사람들은 왜 그것을 포함합니까? 전혀 아무것도합니까? 당신이 한 서명은 일반적으로 당신을위한 코드의 바로 가기를 대체 할 컴파일러 일치 같은 방법 이름 자체를 전달하는 경우

+0

저는 일반적으로'new DelegateType (...)'을 사용하지 않으며, 그것이 무엇인가를 알고 싶습니다. MSDN은 여기에 관해서 정말로 이야기하지 않습니다 : http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx –

+0

가능한 복제본 [C# : '+ = anEvent'와 '+ = 새로운 EventHandler (anEvent)'] (http://stackoverflow.com/questions/550703/c-difference-between-anevent-and-new-eventhandleranevent) – nawfal

답변

12

대부분의 경우 (이 간단한 예에서는 아닐지라도 몇 가지 과부하 규칙이 있습니다). 그러나 이전 버전의 C#에서는 대리자 형식 유추가 없었습니다. 따라서이 튜토리얼은 (a) 델리게이트 형식 추론이 가능하기 전에 작성되었거나 (b) 설명 목적으로 자세한 정보가 필요했다. 완성도를 들어

// Old-school style. 
Chef(new CookingInstructions(MakeThreeCourseMeal)); 

// Explicitly make an anonymous delegate. 
Chef(delegate { MakeThreeCourseMeal }); 

// Implicitly make an anonymous delegate. 
Chef(MakeThreeCourseMeal); 

// Lambda. 
Chef(() => MakeThreeCourseMeal()); 

// Lambda with explicit block. 
Chef(() => { AssembleIngredients(); MakeThreeCourseMeal(); AnnounceDinnerServed(); }); 
2

AsyncCallback 그냥 C#에서 대리자입니다, 그것은

public delegate void AsyncCallback(IAsyncResult ar); 

로 선언된다.

Reflector을 사용하여 간단히 확인할 수 있습니다. 당신이 이것을 가지고 있다면.

request.BeginGetResponse(TestMethod, null); 

static void (IAsyncResult r) 
     { 
      //do something 
     } 

컴파일 된 코드는 실제로 다음과 같이 보입니다.

request.BeginGetResponse(new AsyncCallback(Test), null); 
2

, 이것은과 (와 C# 2.0 (.NET 1.1) C# 1.2 사이에 변경 :

다음은 대리자 형식의 추론의 장점을 취할 수있는 몇 가지 다른 방법의 요약입니다. NET 2.0). 따라서 2.0 이후부터 대부분의 시나리오에서 new SomeDelegateType(...)을 생략 할 수 있습니다. 이상하게도 툴링은 변경되지 않았으므로 IDE에 someObj.SomeEvent +=을 입력하면 IDE는 (tab) 위임 유형을 포함한 전체 버전을 제안합니다.

관련 문제