Вход/Регистрация
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
вернуться

Троелсен Эндрю

Шрифт:

Console.WriteLine("***** Анонимные методы *****\n");

Car c1 = new Car("SlugBug", 100, 10);

// Регистрация обработчиков событий с помощью

// анонимных методов.

c1.AboutToBlow += delegate {

Console.WriteLine("Оx! Едем слишком быстро!");

};

c1.AboutToBlow += delegate(object sender, CarEventArgs e) {

Console.WriteLine("Сообщение от Car: {0}", e.msg);

};

c1.Exploded += delegate(object sender, CarEventArgs e) {

Console.WriteLine("Фатальное сообщение от Car: {0}", e.msg);

};

…

 }

}

Замечание. После завершающей фигурной скобки анонимного метода должна следовать точка с запятой. Если пропустить точку с запятой, будет получено сообщение об ошибке компиляции.

Обратите вниманий на то, что тип Program уже не определяет конкретные статические программы обработки событий, такие как, например, CarAboutToBlow и CarExploded. Вместо этого здесь указаны безымянные (т.е. анонимные) методы, определяемые "внутристрочно" в тот момент, когда вызывающая сторона обрабатывает событие, используя синтаксис +=.

Базовый синтаксис анонимного метода соответствует следующему представлению в псевдокоде.

class SomeCaller {

 static void Main(string[] args) {

SomeType t = new SomeType;

t.SomeEvent += delegate(необязательныеАргументыДелегата) { /* операторы */};

 }

}

В предыдущем варианте метода Main следует обратить внимание на то, что при обработке первого события AboutToBlow мы не определяем аргументы, передаваемые делегатом.

c1.AboutToBlow += delegate {

 Console.WriteLine("Ox! Едем слишком быстро!");

};

Строго говоря, получать входные аргументы, посылаемые конкретным событием, не обязательно. Но если вы хотите использовать поступающие аргументы, вы должны указать параметры, прототипы которых заданы типом делегата (как это сделано во втором случае обработки событий AboutToBlow и Exploded). Например:

c1.AboutToBlow += delegate(object sender, CarEventArgs e) {

 Console.WriteLine("Важное сообщение от Car: {0}", e.msg);

};

Доступ к "внешним" переменным

Анонимные методы интересны в том отношении, что они позволяют доступ к локальным переменным определяющего их метода. Формально говоря, такие переменные являются "внешними переменными" анонимного метода. Для примера предположим, что наш метод Main определяет локальную целую переменную-счетчик с именем aboutToBlowCounter. В рамках анонимных методов, обрабатывающих событие AboutToBlow, мы будем увеличивать этот счетчик на 1 и печатать его значение в конце Main.

static void Main(string[] args) {

 …

 int aboutToBlowCounter = 0;

 // Создание машины.

 Car c1 = new Car("SlugBug", 100, 10);

 // Регистрация обработчиков событий в виде анонимных методов.

 c1.AboutToBlow += delegate {

aboutToBlowCounter++;

Console.WriteLine("Ox! Едем слишком быстро!");

 };

 c1.AboutToBlow += delegate(string msg) {

aboutToBlowCounter++;

Console.WriteLine("Важное сообщение от Car: {0}", msg);

 };

 …

 Console.WriteLine("Событие AboutToBlow вызывалось {0} раз(а).", aboutToBlowCounter);

 Console.ReadLine;

}

В результате выполнения этого обновленного метода Main завершающий оператор Console.WriteLine сообщит вам о том, что событие AboutToBlow генерировалось дважды.

  • Читать дальше
  • 1
  • ...
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: