Основы работы с Visual Studio. Net

Вид материалаДокументы

Содержание


Многообъектные делегаты
Подобный материал:
1   2   3   4   5   6   7   8   9

Многообъектные делегаты


В коде Matem2 делегат Mydelegate и метод calculate имеют одинаковую сигнатуру в соответствии с общими правилами. Для обращения через делегат к методу используется переменная int chislo, не содержащая вводимых значений для вычислений. Мы использовали один экземпляр делегата для обращения к одному методу, причем для вычисления значения новой переменной мы каждый раз ее объявляли. Однако делегат может вмещать в себя несколько методов. Такой делегат называется многообъектным (множественным) — при обращении к нему он последовательно вызывает каждый метод.

Создайте новое консольное приложение. Назовите его Matem3. Рассмотрим листинг с комментариями этого приложения (результат — рис. 1.35):

using System;


namespace Matem3

{

class matematika

{

public int a;


public void calculatesamochislo(int chislo)

{

Console.WriteLine ("Само число: " + a);

}

public void calculatecvadrat(int chislo)

{

int b = a*a;

Console.WriteLine ("\nКвадрат: " + b);

}

public void calculatecub(int chislo)

{

int c = a*a*a;

Console.WriteLine ("\nКуб: " + c);

}

}


class Class1

{

delegate void Mydelegate(int chislo);

[STAThread]

static void Main(string[] args)

{

matematika primer = new matematika();

Mydelegate del = new Mydelegate(primer.calculatesamochislo);

//Экземпляру делегата del добавляем метод calculatecvadrat

del+= new Mydelegate(primer.calculatecvadrat);

//Экземпляру делегата del добавляем метод calculatecvadrat

del+= new Mydelegate(primer.calculatecub);

primer.a = 2;

del(1);

// //Развернутый вариант

// del=del + new Mydelegate(primer.calculatecvadrat);

// del = del+ new Mydelegate(primer.calculatecub);

// primer.a = 2;

// del(1);


}

}

}

Листинг 1.5.

В языке С# вы уже сталкивались с сокращенной записью операторов, так, выражение x += y в развернутом виде означает x = x + y. Делегаты понимают синтаксис + и += , и поэтому в комментарии указывается развернутый вариант добавления методов. Делегаты понимают также операции – и –= для удаления вызовов методов из делегата.




Рис. 1.35.  Результат приложения Matem3

События


С помощью событий приложения Windows получают уведомления о том, что что-то произошло. Например, при нажатии на кнопку мыши приложение, в окне которого вы произвели это действие, будет уведомлено об этом событии. То же самое происходит, когда вы делаете что-то с помощью клавиатуры. Событийная модель стала основой современного программирования. Обработчик события реализуется на языке С#, как правило, в виде делегата.

Создайте новое консольное приложение и назовите его Event (Событие). Рассмотрим листинг этого приложения:

using System;


namespace Event

{

//Объявляем делегат Mydelegate

delegate void Mydelegate();

//Создаем класс Button, в котором будет находится событие и метод для него

class Button

{

// Объявляем событие Sobitie на основе делегата

public event Mydelegate Sobitie;

//Cоздаем метод для события, который просто будет обращаться к событию

public void MetoddlyaSobitiya()


{

//Можно вставить проверку наличия события

//if (Sobitie !=null)

Sobitie();

}


class Class1

{

[STAThread]

static void Main(string[] args)

{

// Создаем экземпляр btn класса Button

Button btn = new Button();

//привязываем обработчика для события Sobitie экземпляра btn. Когда в //скобках укажете

// Metodobrabotchik, нажмите дважды клавишу Tab

btn.Sobitie += new Mydelegate(Metodobrabotchik);

//Развернутая запись строки выше

//btn.Sobitie = btn.Sobitie + new Mydelegate(Metoddlyadelegata);

//вызываем метод для события

btn.MetoddlyaSobitiya();

}

// Создаем метод-обработчик, если среда сгенерировала его сама — добавляем //строку вывода

private static void Metodobrabotchik ()

{

Console.WriteLine("Произошло событие");

}

}

}

}

Листинг 1.6.

Сначала мы в строке

delegate void Mydelegate();

объявляем делегат. Параметров у него нет (хотя могут и быть), тип — void.

Затем мы объявляем класс Button, внутри которого объявляем событие Sobitie (имя произвольное):

...

public event Mydelegate Sobitie;

...

Синтаксис следующий: модификатор доступа (здесь — public), затем ключевое слово event, потом имя делегата, на основании которого мы создаем наше событие (здесь Mydelegate) и, наконец, имя события (Sobitie). Обратите внимание, что событие появится на вкладке Class View (рис. 1.36).



Рис. 1.36.  Событие в окне Class View. Значок события имеет характерный вид молнии

Далее в нашем классе с событиями мы в некотором методе это событие вызываем:

...

public void MetoddlyaSobitiya()


{

Sobitie();

}


Класс с событием создан. Далее в классе Class1 мы объявляем экземпляр btn нашего класса Button (того самого, в котором мы объявили событие):

Button btn = new Button();

Остается теперь указать, что за обработчик будет у события Sobitie класса Button. Это мы делаем в строке

btn.Sobitie += new Mydelegate(Metodobrabotchik);

Этой строчкой мы указываем, что событие Sobitie будет обрабатывать метод Metodobrabotchik класса Class1. Когда мы указываем этот метод, IntellSense предложит дважды нажать клавишу Tab для создания шаблона метода Metodobrabotchik. Сделав это, нам останется только добавить код в методе — здесь вывод строки "Произошло событие":




private static void Metodobrabotchik ()

{

Console.WriteLine("Произошло событие");

}




Результатом выполнения этой программы станет вывод на экран строки "Произошло событие" (рис. 1.37).




Рис. 1.37.  Результат приложение Event

Для того чтобы лучше разобраться в логике этого листинга, желательно просмотреть ее выполнение в пошаговом режиме (используйте клавишу F11).