Главная » C# » Групповое использование делегатов в Visual C# (Sharp)

0

В примерах с делегатом существует взаимно однозначное отношение. Но делегаты по  своему  существу  способны  к  групповым  взаимоотношениям.  Так,  в  примере с  итератором  для  вычисления текущей  суммы  и  максимального  значения список обрабатывается  в  цикле  только  один  раз.  Далее  приводится  модифицированный код примера, в котором вызываются две реализации делегатов в одной итерации. List<int> 1st = new List<int> { 1, 2, 3, 4 };

int runningTotal = 0;

int maxValue = int.MinValue;

ProcessValue anonymous = new ProcessValue{ delegate(int value) {

runningTotal += value;

}) ;

anonymous += new ProcessValue( delegate(int value) {

if (value > maxValue) { maxValue = value;

}

}) ;

1st.Iterate(anonymous);

Console.WriteLine("Running total is (" + runningTotal + ")"); Console.WriteLine("Maximum value is (" + maxValue + ")");

Жирным шрифтом в примере выделены присваивание и добавление реализации делегата переменной. Имеется лишь одна переменная anonymous, которая при вове с использованием нотации делегата представляет один вызов метода. Среда исполнения .NET понимает, что одна переменная может представлять множествеые реализации делегатов и добавляет все необходимые механизмы для обработки группового обращения. В  результате  данного  группового  обращения  метод iterat e ()  нужно вызывать только один раз, чтобы выполнить две операции.

Реализация делегата удаляется с переменной с помощью оператора -=.

void RemoveDelegate( ProcessValue toRemove) { anonymous -= toRemove;

}

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии