我最近一直在玩HttpWebRequest
,在教程中他们总是这样做:
IAsyncResult result = request.BeginGetResponse(
new AsyncCallback(UpdateItem),state);
但new AsyncCallback
似乎并不是必要的。如果UpdateItem
具有正确的签名,那么似乎没有问题。那么人们为什么要包括它呢?它有什么用吗?
答案 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 )完整版本,包括委托类型