dotSITE
Work in Murano Software. Учебник по C# Шаблоны проектирования
новости материалы решения форумы группы настройки/о проекте

Делегаты

В платформе .NET, и соответственно в C#, реализована концепция делегатов - объектно-ориентированного подобия указателей на функции в C++. Делегаты имеют очень обширную сферу применения, в том числе и для реализации событийной модели. Делегаты - объектно-ориентированная, безопасная концепция, не нарушающая типовой защищенности. При использовании делегата для указания на статический метод - он привязывается только к этому методу, в случае же указания на нестатический метод - он привязывается к экземпляру класса и этому методу.

Объявление делегатов имеет следующий синтаксис:

[атрибуты] [модификаторы] delegate возвращаемый_тип идентифиратор ([параметры]);

где модификаторы - это либо new, либо модификаторы доступа.

Существует два типа делегатов - одиночные (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