我一直在玩HttpWebRequest
小号近来,在教程他们总是这样:C#新[委托]没有必要?
IAsyncResult result = request.BeginGetResponse(
new AsyncCallback(UpdateItem),state);
但new AsyncCallback
似乎并没有被necesary。如果UpdateItem
有正确的签名,那么似乎没有问题。那么人们为什么要包括它?它是否做任何事情?
我一直在玩HttpWebRequest
小号近来,在教程他们总是这样:C#新[委托]没有必要?
IAsyncResult result = request.BeginGetResponse(
new AsyncCallback(UpdateItem),state);
但new AsyncCallback
似乎并没有被necesary。如果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将建议(通过选项卡选项卡)完整版本包括委托类型。
我通常不会使用'new DelegateType(...)',也想知道这是否会做任何事情。 MSDN在这里没有真正谈到它:http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx – 2009-12-27 07:34:26
可能的重复[C#:'+ = anEvent'和'+ = new EventHandler(anEvent)'](http://stackoverflow.com/questions/550703/c-difference-between-anevent-and-new-eventhandleranevent) – nawfal 2014-07-06 20:16:24