2009-12-27 6 views
5

Ich habe in letzter Zeit mit HttpWebRequest s gespielt, und in den Tutorials sie immer:C# neu [Delegat] nicht notwendig?

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

Aber new AsyncCallback nicht necesary zu sein scheint. Wenn UpdateItem die richtige Signatur hat, dann scheint es kein Problem zu geben. Warum schließen Leute es ein? Tut es überhaupt etwas?

+0

Normalerweise verwende ich 'new DelegateType (...)', würde auch gerne wissen, ob das irgendwas macht. MSDN spricht hier nicht wirklich darüber: http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx –

+0

möglich Duplikat von [C#: Unterschied zwischen '+ = anEvent' und '+ = neuer EventHandler (anEvent)'] (http://stackoverflow.com/questions/550703/c-difference-between-anevent-and-new-venthandleranevent) – nawfal

Antwort

12

Es ist die gleiche Sache, vor allem (es gibt ein paar Überlastregeln, um darüber nachzudenken, wenn auch nicht in diesem einfachen Beispiel). In früheren Versionen von C# gab es jedoch keine Rückschlüsse vom Delegattyp. So wurde das Tutorial entweder (a) geschrieben, bevor die Art der Delegierten-Inferenz verfügbar war, oder (b) sie wollten zu Erklärungszwecken ausführlich sein.

Hier ist eine Zusammenfassung von einigen der verschiedenen Möglichkeiten, wie Sie die Vorteile von Delegattyp Inferencing nehmen kann:

// 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 nur ein Delegierter in C# ist, wird erklärt, wie

public delegate void AsyncCallback(IAsyncResult ar); 

Wenn Sie den Namen der Methode selbst, solange passieren, wie die Unterschrift des Compilers entspricht, wird in der Regel den Code für Sie ersetzen, es ist nur Verknüpfung.

Sie können dies einfach überprüfen mit Reflector. Wenn du das zum Beispiel hast.

request.BeginGetResponse(TestMethod, null); 

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

Der kompilierte Code wird tatsächlich so aussehen.

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

Für Vollständigkeit, dies ändert sich zwischen C# 1.2 (.NET 1.1) und C# 2.0 (mit. NET 2.0). So kann man ab 2.0 in den meisten Szenarien die new SomeDelegateType(...) weglassen. Seltsamerweise hat sich das Tooling nicht geändert, so dass in der IDE, wenn Sie someObj.SomeEvent += eingeben, die IDE (über TabTab) die Vollversion einschließlich Delegattyp vorschlagen wird.