C#new [delegate]没有必要吗?

时间:2009-12-27 07:29:44

标签: c# delegates

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

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

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

3 个答案:

答案 0 :(得分: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(); });

答案 1 :(得分: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 :(得分:2)

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