2009-12-27 31 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 – 2009-12-27 07:34:26

+0

可能的重复[C#:'+ = anEvent'和'+ = new EventHandler(anEvent)'](http://stackoverflow.com/questions/550703/c-difference-between-anevent-and-new-eventhandleranevent) – nawfal 2014-07-06 20:16:24

回答

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#1.2之间变化(与.NET 1.1)和C#2.0(带。 NET 2.0)。所以从2.0开始,在大多数情况下确实可以省略new SomeDelegateType(...)。奇怪的是,工具并没有改变,所以在IDE中,如果您键入someObj.SomeEvent += IDE将建议(通过选项卡选项卡)完整版本包括委托类型。