Читаем Язык программирования С# 2005 и платформа .NET 2.0. полностью

Сигнатуры методов Invoke() и BeginInvoke() выглядят так, как и ожидается, но обратите внимание на метод EndInvoke(), который теперь включает и все аргументы out/ref, определенные типом делегата.

sealed class MyOtherDelegate : System.MulticastDelegate {

 public MyOtherDelegate (object target, uint functionAddress);

 public string Invoke(out bool a, ref bool b, int c);

 public IAsyncResult BeginInvoke(out bool a, ref bool b, int c, AsyncCallback cb, object state);

 public string EndInvoke(out bool a, ref bool b, IAsyncResult result);

}

Итак, в результате определения делегата в C# компилятор генерирует изолированный класс с тремя методами, для которых возвращаемые значения и типы параметров соответствуют декларации делегата. Следующий псевдокод приближенно описывает соответствующий базовый шаблон.

// Это только псевдокод!

public sealed class ИмяДелегата : System.MulticastDelegate {

 public ИмяДелегата(object target, uint functionAddress);

 public возвращаемоеЗначениеДелегатаInvoke(всеПараметрыДелегата);

 public IAsyncResult BeginInvoke(всеПараметрыДелегата, AsyncCallback cb, object state);

 public возвращаемоеЗначениеДелегата EndInvoke(всеПараметрыRefOutДелегата, IAsyncResult result);

}

Базовые классы System.MulticastDelegate и System.Delegate

Таким образом, при создании типов c помощью) ключевого слова delegate в C# вы неявно объявляете тип класса, являющегося производным от System.MulticastDelegate. Этот класс обеспечивает своим потомкам доступ к списку с адресами тех методов, которые поддерживаются типом делегата, а также предлагает несколько дополнительных методов (и ряд перегруженных операций), обеспечивающих взаимодействие со списком вызовов. Вот программный код некоторых членов System.MulticastDelegate.

[Serializable]

public abstract class MulticastDelegate: Delegate {

 // Методы

public sealed override Delegate[] GetInvocationList();

 public static bool operator==(MulticastDelegate d1, MulticastDelegate d2);

 public static bool operator!=(MulticastDelegate d1, MulticastDelegate d2);

 // Поля

 private IntPtr _invocationCount;

 private object _invocationList;

}

Дополнительные функциональные возможности System.MulticastDelegate получает от своего родительского класса System.Delegate. Вот часть определения этого класса.

[Serializable, ClassInterface(ClassInterfaceType.AutoDual)]

public abstract class Delegate: ICloneable, ISerializable {

 // Методы

 public static Delegate Combine(params Delegate[] delegates);

 public static Delegate Combine(Delegate a, Delegate b);

 public static Delegate Remove(Delegate source, Delegate value);

 public static Delegate RemoveAll(Delegate source, Delegate value);

 // Перегруженные операции

 public static bool operator==(Delegate d1, Delegate d2);

 public static bool operator!=(Delegate d1, Delegate d2);

 // Свойства

 public MethodInfo Method {get;}

 public object Target {get;}

}

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

Таблица 8.1. Избранные члены System.MulticastDelegate и System.Delegate

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT