|
|
|
В платформе .NET, и соответственно в C#, реализована концепция делегатов - объектно-ориентированного подобия указателей на функции в C++. Делегаты имеют очень обширную сферу применения, в том числе и для реализации событийной модели. Делегаты - объектно-ориентированная, безопасная концепция, не нарушающая типовой защищенности. При использовании делегата для указания на статический метод - он привязывается только к этому методу, в случае же указания на нестатический метод - он привязывается к экземпляру класса и этому методу.
Объявление делегатов имеет следующий синтаксис:
[атрибуты] [модификаторы] delegate возвращаемый_тип идентифиратор ([параметры]); |
Существует два типа делегатов - одиночные (Singlecast) и комбинированные (Multicast). С точки зрения синтаксиса объявления - они различаются только типом возвращаемого значения. Разница видна при просмотре откомпилированного кода с помощью IL Disassembler (ildasm). При описании одиночных делегатов создается класс, наследующий System.Delegate, а при описании комбинированных - наследующий System.MulticastDelegate.
![]() |
![]() |
Как вы можете видеть, объявление делегата создает класс - а не просто указатель на метод, именно поэтому не нарушаются объектно-ориентированные концепции.
Приведем пример использования одиночного делегата:
using System;
public delegate int SingleDelegate(int x);
public class SampleDelegateClass {
int sampleMethod(int x) {
//некоторый код
Console.WriteLine(x);
return 0;
}
public static void Main(String[] args)
{
// Создаем экземпляр этого класса
SampleDelegateClass sdc = new SampleDelegateClass();
//Создаем экземпляр делегата
SingleDelegate sDelegate = new SingleDelegate(sdc.sampleMethod);
Console.WriteLine(sDelegate(255));
}
} |
По своей структуре комбинированные делегаты - это связный список делегатов с возвращаемым типом - void. Вообще любой делегат, с возвращаемым типом void является комбинированным, даже если представляет связный список с одним элементом. Комбинированные делегаты наследуют System.MulticastDelegate. Комбинированные делегаты могут соединяться с помощью статического метода Combine класса System.Delegate:
public static Delegate Combine(Delegate[]); // комбинирует два делегата public static Delegate Combine(Delegate, Delegate); // комбинирует массив делегатов |
Для удаления делегата из связного списка существует статический метод Remove класса System.Delegate:
public static Delegate Remove(Delegate source, Delegate value);
где source - связный список делегатов, value - удаляемый делегат.
Комбинирование и удаление делегата также можно осуществлять с помощью перегруженных операторов += и -= соответственно.
Приведем пример использования комбинированных делегатов:
using System;
public delegate void sampleDelegate(int x);
public class DelegateClass1 {
public void sampleMethod(int x) {
Console.WriteLine(x-2);
}
}
public class DelegateClass2 {
public void sampleMethod(int x) {
Console.WriteLine(x+2);
}
}
public class UseDelegates{
public static void Main(String[] args)
{
DelegateClass1 dc1 = new DelegateClass1();
DelegateClass2 dc2 = new DelegateClass2();
//Создаем экземпляр делегата
sampleDelegate sDelegate1 = new sampleDelegate(dc1.sampleMethod);
sampleDelegate sDelegate2 = new sampleDelegate(dc2.sampleMethod);
sampleDelegate sdCombination;
sdCombination=(sampleDelegate)Delegate.Combine(sDelegate1,sDelegate2);
sdCombination(3);
}
} |
Здесь мы комбинируем sDelegate1 и sDelegate2 в sdCombination, а затем вызываем его. Получить массив делегатов, скомбинированных в один делегат sdCombination можно с помощью метода GetInvocationList(), который возвращает массив делегатов.
Delegate[] sDelegates; sDelegates = sdCombination.GetInvocationList(); |
| << Предыдущая | Следующая >> |
| Контакт | Реклама на сайте | Спонсорам | Веб мастерам |
Лицензионное соглашение
- © 2000-2012 dotSITE
Хостинг .NET предоставлен
PARKING.RU
Поддержку сайта осуществляет Murano Software Inc., Offshore software development