Что означает этот синтаксис c #? - PullRequest
3 голосов
/ 16 января 2011

Привет, у меня есть небольшая проблема с пониманием синтаксиса такого типа

public delegate void DelegateType();
BeginInvoke(new DelegateType(functionName));

Может кто-нибудь сказать мне, что именно означает новый DelegateType (functionName).Почему я должен использовать новое ключевое слово ??

Ответы [ 4 ]

6 голосов
/ 16 января 2011

См. Документацию .

Делегат - это тип, содержащий метод.
Вы создаете новый экземпляр типа делегата, указывающий на существующий метод.

C # 2 добавляет неявное преобразование из группы методов в любой соответствующий тип делегата.
Однако, поскольку BeginInvoke не принимает определенный тип делегата (например, System.Action), вам всегда нужно явно создавать экземпляр делегата.

1 голос
/ 16 января 2011
 public delegate void DelegateType();

Это определяет синтаксис для делегата .Это ссылка на метод, статический или метод экземпляра.

Когда вы вызываете BeginInvoke , вы передаете делегат в качестве параметра.Компилятор C # преобразует любой явный тип делегата в System.Delegate, но поскольку параметр определен как принимающий любого делегата (через System.Delegate ), вы должны явно определить тип.

Когда вы указываете:

new DelegateType(functionName)

Вы создаете делегат определенного типа (DelegateType), который затем передается функции.

Часто более новые API будут использовать известныетипа, например System.Action (который имеет тот же синтаксис, что и тип DelegateType).Если метод принимает «Действие», вам не понадобится приведенное выше определение, и вы можете сделать следующее:

CallMethodTakingAction(functionName);
1 голос
/ 16 января 2011

Первый оператор объявляет тип делегата, второй оператор создает новый делегат DelegateType.

Из соответствующей статьи MSDN (подробнее читайте в статье!):

Как только тип делегата был объявлен, объект делегата должен быть создан и связан с определенным методом.Как и все другие объекты, новый объект делегата создается с новым выражением.Однако при создании делегата аргумент, передаваемый новому выражению, является особенным - он записывается как вызов метода, но без аргументов метода.

0 голосов
/ 16 января 2011

«DelegateType» - это всего лишь тип вещи, поэтому, как и любой другой тип, вы хотите сказать «вот один экземпляр этого типа», вам нужно использовать «новый».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...