Главная » C# » Делегаты в Visual C# (Sharp)

0

С самого начала в языке С# применялась концепция делегатов. Делегат — это мод, не имеющий типа. Рассмотрим, например, следующее определение типа:

interface IExample { void Method();

}

Если данный интерфейс преобразовать в делегата, то код будет выглядеть так:

delegate void Method();

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

Для решения проблемы, представленной в предыдущем разделе, можно применить подход с использованием делегатов. Для этого нужно определить функциональность для выполнения операций в цикле. Такая  функциональность  называется  итератом. А для выполнения операций с итератором посредством делегата интегрируется другая функциональность. В результате у нас имеются две отдельные функционалости, объединенные посредством применения технологии компонентов.

Исходный код предыдущего примера для оператора foreach, модифицированный с применением делегатов, будет выглядеть таким образом:

public delegate void ProcessValue(int value); public static class Extensions {

public static void Iterate(this ICollection<int> collection,

ProcessValue cb) {‘ foreach (int element in collection) {

cb(element);

}

}

static class Tests {  static int _runningTotal;

static void ProcessRunningTotal(int value) {

_runningTotal += value;             •

}

static int _maxValue;

static void ProcessMaximumValue(int value) { if (value > _maxValue) {

_ maxValue = value;

}

}

static void DoRunningTotalAndMaximum() { List<int> 1st = new List<int> { 1, 2, 3, 4 };

_runningTotal = 0;

1st.Iterate(new ProcessValue(ProcessRunningTotal)); Console.WriteLine("Running total is (" + _runningTotal + ")");

_maxValue = int.MinValue;

1st.Iterate(new ProcessValue(ProcessMaximumValue)); Console.WriteLine("Maximum value is (" + _maxValue +")");

}

public static void RunAllO { DoRunningTotalAndMaximum() ;

}

}

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

По теме:

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