Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 10554 / 332 | Оценка: 4.12 / 4.01 | Длительность: 19:18:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 18:

C#. Отражения. Делегаты

< Лекция 17 || Лекция 18: 123 || Лекция 19 >
Аннотация: В лекции рассматривается использование делегатов для вызовов методов, применение делегатов как методов обратного вызова. Вводится понятие небезопасного кода, описывается процесс применения в управляемом коде фрагментов небезопасного кода и DLL-библиотек.

Объявление делегата

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

Делегат объявляет новый ссылочный тип.

Делегат позволяет передавать функцию как параметр.

Объявление делегата имеет следующее формальное описание:

[атрибуты] [модификаторы] delegate тип_результата имя_делегата ([список_формальных параметров]);

Модификаторами делегата могут быть:

  • new
  • public
  • protected
  • private
  • internal
  • unsafe (если в списке параметров используется указатель).

Тип результата должен соответствовать типу результата используемого метода. При создании делегата требуется, чтобы передаваемый как делегат метод имел ту же сигнатуру метода, что и в объявлении делегата.

Например:

using System;
delegate void MyDelegate();    // Этот делегат позволяет 
                // вызывать методы без параметров 
                // и без возвращаемого значения

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

Например:

using System;
delegate void MyDelegate();
namespace MyDelegat1
{ class Class1
{[STAThread]
static void Main(string[] args) {
  CA var1= new CA();
  // Экземпляр делегата для нестатического метода:
  MyDelegate F_d = 
           new MyDelegate(var1.F_Instance);
  F_d();
  // Экземпляр делегата для статического метода:
  F_d = new MyDelegate(CA.F_Static);
  F_d();
 }  } 
public class CA
{ public CA()     {  }
  public void F_Instance()
    { Console.WriteLine("Вызов метода класса с 
                    использованием делегата");  }
  public static void F_Static()
    { Console.WriteLine("Вызов статического метода с 
                    использованием делегата");  }
}
< Лекция 17 || Лекция 18: 123 || Лекция 19 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Денис Комаров
Денис Комаров
Россия, Москва