Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Имитация обобщенных делегатов в .NET 1.1

Имитация обобщенных делегатов в .NET 1.1

Как видите, обобщенные делегаты предлагают более гибкий подход для указания вызываемых методов. В рамках .NET 1.1 аналогичного результата можно достичь с помощью базового System.Object.

public delegate void MyDelegate(object arg);

Это позволяет посылать любой тип данных целевому объекту делегата, но при этом не гарантируется типовая безопасность, а кроме того, остаются нерешенными проблемы создания объектных образов. Предположим, например, что мы создали два экземпляра MyDelegate, которые указывают на один и тот же метод MyTarget. Обратите внимание на проблемы создания объектных образов и восстановления значений, а также на отсутствие гарантий типовой безопасности.

class Program {
 static void Main(string[] args) {
  …
  // Регистрация цели с помощью
  // 'традиционного' синтаксиса делегата.
  MyDelegate d = new MyDelegate(MyTarget) d("Дополнительные строковые данные");
  // Регистрация цели с помощью
  // группового преобразования метода.
  MyDelegate d2 = MyTarget;
  d2(9); // Проблема объектного образа.
  …
 }
 // Ввиду отсутствия типовой безопасности мы должны
 // определить соответствующий тип до преобразования.
 static void MyTarget(object arg) {
  if (arg is int) {
   int i = (int)arg; // Проблема восстановления значения.
   Console.WriteLine("++arg: {0}", ++i);
  }
  if (arg is string) {
   string s = (string) arg;
   Console.WriteLine("arg в верхнем регистре: {0}", s.ToUpper());
  }
 }
}

Когда вы посылаете целевому объекту тип, характеризуемый значением, это значение (конечно же) "упаковывается" в объект и "распаковывается" после его получения целевым методом. Точно так же, поскольку поступающий параметр может быть всем чем угодно, вы должны динамически проверить соответствующий тип перед тем, как выполнить преобразование. С помощью обобщенных делегатов вы можете получить всю необходимую гибкость без "проблем".

Оглавление книги


Генерация: 3.659. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз