C#, новый [делегат], не необходимый?

Я играл с HttpWebRequests в последнее время, и в учебных руководствах они всегда делают:

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

Но new AsyncCallback кажется, не необходим. Если UpdateItem имеет правильную подпись, затем, кажется, нет проблемы. Итак, почему люди включают его? Это делает что-нибудь вообще?

5
задан mpen 27 December 2009 в 07:29
поделиться

3 ответа

В основном это одно и то же (есть несколько правил перегрузки, хотя и не в этом простом примере). Но в предыдущих версиях 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(); });
12
ответ дан 18 December 2019 в 10:45
поделиться

AsyncCallback - просто делегат на C#, он объявляется как

public delegate void AsyncCallback(IAsyncResult ar);

Когда вы передаете само имя метода, до тех пор пока сигнатура совпадает, компилятор обычно заменяет вам код, его просто ярлык.

Вы можете просто проверить это, используя Отражатель. Если у Вас есть такой пример.

request.BeginGetResponse(TestMethod, null);

 static void (IAsyncResult r)
        {
           //do something
        }

На самом деле скомпилированный код будет выглядеть так.

   request.BeginGetResponse(new AsyncCallback(Test), null);
2
ответ дан 18 December 2019 в 10:45
поделиться

Для полноты, это изменяется между C# 1.2 (с .NET 1.1) и C# 2.0 (с .NET 2.0). Таким образом, начиная с версии 2.0, вы действительно можете опустить новый SomeDelegateType(...) в большинстве сценариев. Как ни странно, инструментарий не изменился, поэтому в IDE, если вы наберете someObj.SomeEvent +=, то IDE предложит (через tab tab) полную версию, включая тип делегата.

.
2
ответ дан 18 December 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: