Я играл с HttpWebRequest
s в последнее время, и в учебных руководствах они всегда делают:
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);
Когда вы передаете само имя метода, до тех пор пока сигнатура совпадает, компилятор обычно заменяет вам код, его просто ярлык.
Вы можете просто проверить это, используя Отражатель. Если у Вас есть такой пример.
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, вы действительно можете опустить новый SomeDelegateType(...)
в большинстве сценариев. Как ни странно, инструментарий не изменился, поэтому в IDE, если вы наберете someObj.SomeEvent +=
, то IDE предложит (через tab tab) полную версию, включая тип делегата.