Простейший пример делегата

Простейший пример делегата

В начале освоения приемов работы с делегатами у программиста может возникать много вопросов. Поэтому мы начнем с рассмотрения очень простого примера, в котором используется созданный нами тип делегата BinaryOp. Вот программный код, который мы собираемся проанализировать.

namespace SimpleDelegate {

 // Этот делегат может указывать на любой метод,

 // принимавший два целых значения

 // и возвращающий целое значение.

 public delegate int BinaryOp(int x, int y);

 // Этот класс содержит методы, на которые

 // будет указывать BinaryOp.

 public class SimpleMath {

  public static int Add(int x, int y) {return x + y;}

  public static int Subtract(int x, int y) {return x – у;}

 }

 class Program {

  static void Main(string[] args) {

   Console.WriteLine("***** пример делегата ***** ");

   // Создание объекта BinaryOp,

   // "указывающего" на SimpleMath.Add().

   BinaryOp b = new BinaryOp(SimpleMath.Add);

   // Вызов метода Add() с помощью делегата.

   Console.WriteLine('10 + 10 равно {0}", b(10, 10));

   Console.ReadLine();

  }

 }

}

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

Чтобы добавить целевой метод в делегат, нужно просто передать имя этою метода конструктору делегата. Тогда вы сможете вызвать указанный член с помощью синтаксической конструкции, подобной прямому вызову функции.

// Здесь на самом деле вызывается Invoke()!

Console.WriteLine("10 + 10 is {0}", b(10, 10));

"За кулисами" среда выполнения вызывает сгенерированный компилятором метод Invoke(). Вы можете проверить это сами, если откроете компоновочный блок с помощью ildasm.exe и посмотрите на программный код CIL метода Main().

.method private hidebysig static void Main(string[] args) cil managed {

 …

 .locals init ([0] class SimpleDelegate.BinaryOp b)

 ldftn int32 SimpleDelegate.SimpleMath::Add(int32, int32)

 …

 newobj instance void SimpleDelegate.BinaryOp::.ctor(object, native int)

 stloc.0

 ldstr "10 + 10 is {0}"

 ldloc.0

 ldc.i4.s 10

 ldc.i4.s 10

 callvirt instance int32 SimpleDelegate.BinaryOp::Invoke(int32, int32)

 …

}

Напомним, что делегаты .NET (в отличие от указателей функций в C) обеспечивают типовую безопасность. Поэтому, если вы попытаетесь передать делегату метод, "не соответствующий шаблону", вы получите сообщение об ошибке компиляции. Например, предположим, что класс SimpleMath определяет еще один метод, носящий имя SquareNumber().

public class SimpleMath {

 public static int SquareNumber(int a) { return a * a; }

}

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

// Ошибка! Метод не соответствует шаблону делегата!

BinaryOp b = new BinaryOp(SimpleMath.SquareNumber);

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Простейший файл конфигурации

Из книги Документация NetAMS автора Автор неизвестен

Простейший файл конфигурации #NeTAMS version 3.1(1205.408) compiled by root@avm#configuration built Thu Aug 8 09:03:53 2002#begin#global variables configurationdebug noneuser name admin real–name Admin password aaa email root@localhost permit all#services configurationservice server 0login locallisten 20001max–conn 6service processor 0lookup–delay 60flow–lifetime 180policy name ip target proto ippolicy name www target proto tcp port 80 81 8080 3128policy name


Простейший пример

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Простейший пример Чтобы продемонстрировать "пользу" структурированной обработки исключений, нужно создать тип, который в подходящем окружении может генерировать исключение. Предположим, что мы создали новое консольное приложение с именeм SimpleException, в котором


Тип делегата .NET

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

Тип делегата .NET Перед тем как дать формальное определение делегата .NET, давайте обсудим соответствующие перспективы. В Windows API для создания объектов, называемых функциями обратного вызова, предполагается использовать указатели функций (подобные указателям C). Используя


Определение делегата в C#

Из книги О чём не пишут в книгах по Delphi автора Григорьев А. Б.

Определение делегата в C# Чтобы создать делегат в C#, вы должны использовать ключевое слово delegate. Имя делегата может быть любым. Однако делегат должен соответствовать методу, на который этот делегат будет указывать. Предположим, например, что нам нужно создать делегат с


Исследование объекта делегата

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

Исследование объекта делегата Добавим в имеющийся пример вспомогательную функцию с именем DisplayDelegateInfo(). Она будет выводить имена методов, поддерживаемых поступающим типом, производным от System.Delegate, а также имя класса, определяющего метод. Для этого мы выполним цикл по


Более совершенный пример делегата

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

Более совершенный пример делегата Чтобы продемонстрировать более интересные варианты использования делегатов, мы добавим в класс Car пару членов-переменных логического типа. Первый из добавляемых членов предназначен для индикации того, что автомобиль необходимо помыть


Роль делегата AsyncCallback

Из книги OrCAD PSpice. Анализ электрических цепей автора Кеоун Дж.

Роль делегата AsyncCallback Вместо того чтобы выяснять у делегата, завершился ли асинхронный вызов метода, лучше позволить делегату информировать поток вызова о выполнении задания. Чтобы реализовать такое поведение, вы должны предъявить экземпляр делегата System.AsyncCallback методу


Простейший текстовый редактор

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Простейший текстовый редактор Когда вы создаете приложение с однооконным или многооконным интерфейсом при помощи средств MFC AppWizard, в последней диалоговой панели вы можете выбрать базовый класс для окна просмотра приложения. По умолчанию используется класс CView.От класса


Простейший Web-сценарий

Из книги автора

Простейший Web-сценарий Первый Web-сценарий, который мы напишем, будет совсем простым. Он выведет на Web-страницу текущую дату.В самом начале этой книги, приступив к изучению HTML, мы создали небольшую Web-страничку 1.1.htm. Найдем ее и откроем в Блокноте. В самом конце ее HTML- кода,


Простейший Web-сценарий

Из книги автора

Простейший Web-сценарий Первый Web-сценарий, который мы напишем, будет совсем простым. Он выведет на Web-страницу текущую дату.В самом начале этой книги, приступив к изучению HTML, мы создали небольшую Web-страничку 1.1.htm. Найдем ее и откроем в Блокноте. В самом конце ее HTML- кода,


Простейший диодный ограничитель

Из книги автора

Простейший диодный ограничитель Ограничитель используется, чтобы передать на выход только часть входного напряжения произвольной формы. Когда диод включается, происходит отсечка: на выход независимо от входного сигнала подается сумма напряжений на источнике и


Простейший COM-вирус

Из книги автора

Простейший COM-вирус В начале COM-файла обычно находится команда безусловного перехода JMP, состоящая из трех байт. Первый байт содержит код команды 0E9h, следующие два – адрес перехода. Поскольку рассматриваемый ниже вирус учебный, он будет заражать только COM-файлы,


Пример 9-3. Еще один пример ограничения времени ожидания ввода от пользователя

Из книги автора

Пример 9-3. Еще один пример ограничения времени ожидания ввода от пользователя #!/bin/bash# timeout.sh# Автор: Stephane Chazelas,# дополнен автором документа.INTERVAL=5 # предел времени ожиданияtimedout_read() { timeout=$1 varname=$2 old_tty_settings=`stty -g` stty -icanon min 0 time ${timeout}0 eval read $varname # или просто read $varname


А.3.1. Простейший калькулятор

Из книги автора

А.3.1. Простейший калькулятор Для иллюстрации методики профилирования мы напишем простейшую программу- калькулятор. Чтобы программа выполнялась нетривиальным образом, заставим ее работать с унарными числами, чего не встречается в реальных калькуляторах. Код программы