C#new 没有必要吗?

我最近一直在玩HttpWebRequest ,在他们总是做的教程中:

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

但是new AsyncCallback似乎并不是必需的。 如果UpdateItem具有正确的签名,那么似乎没有问题。 那么人们为什么要包括它呢? 它有什么用吗?

大多数情况都是一样的(考虑到一些过载规则,尽管不是在这个简单的例子中)。 但在以前版本的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(); }); 

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); 

为了完整起见,这在C#1.2(使用.NET 1.1)和C#2.0(使用.NET 2.0)之间发生了变化。 因此,从2.0开始,您确实可以在大多数情况下省略new SomeDelegateType(...) 。 奇怪的是,工具没有改变,因此在IDE中如果键入someObj.SomeEvent += IDE将建议(通过选项 选项 )完整版本,包括委托类型。