Использование делегатов

Спецификация делегата определяет форму функции. Для создания экземпляра делегата необходимо использовать функцию, совпадающую с заданной формой. Делегаты иногда называются «безопасными указателями на функции». Однако в отличие от обычных указателей на функции, делегаты C# могут вызывать более одной функции; при совместном добавлении двух делегатов результатом будет делегат, который вызывает их обоих.

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

using System;

public class Container

{

public delegate int CompareItemsCallback(object obj1, object obj2);

public void Sort(CompareItemsCallback compare)

{

// Это не настоящая сортировка, а упрощенный пример

int x = 0;

int y = 1;

object item1 = arr[x];

object item2 = arr[y];

int order = compare(item1, item2);

}

object[] arr = new object[1]; // Содержимое коллекции

}

public class Employee

{

Employee(string name, int id)

{

this.name = name;

this.id = id;

}

public static int CompareName(object obj1, object obj2)

{

Employee emp1 = (Employee) obj1;

Employee emp2 = (Employee) obj2;

return(String.Compare(emp1.name, emp2.name));

}

public static int CompareId(object obj1, object obj2)

{

Employee emp1 = (Employee) obj1;

Employee emp2 = (Employee) obj2;

if (emp1.id > emp2.id)

return(1);

if (emp1.id < emp2.id)

return(-1);

else

return(0);

}

string name;

int id;

}

class Test

{

public static void Main()

{

Container employees = new Container();

// Создать и добавить записи о работниках

// Создать делегата для сортировки по именам

// и выполнить сортировку

Container.CompareItemsCallback sortByName =

new Container.CompareItemsCallback(Employee.CompareName);

employees.Sort(sortByName);

// Теперь работники отсортированы по именам

}

}

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

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

Во всяком случае, выполняла бы — если бы была нормально реализована в нашем примере.