-->

Полное руководство. С# 4.0

На нашем литературном портале можно бесплатно читать книгу Полное руководство. С# 4.0, Шилдт Герберт-- . Жанр: Программирование. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Полное руководство. С# 4.0
Название: Полное руководство. С# 4.0
Дата добавления: 16 январь 2020
Количество просмотров: 273
Читать онлайн

Полное руководство. С# 4.0 читать книгу онлайн

Полное руководство. С# 4.0 - читать бесплатно онлайн , автор Шилдт Герберт

В этом полном руководстве по C# 4.0 — языку программирования, разработанному специально для среды .NET, — детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.

В данной книге вы найдете:- Полное описание средств языка C#- Подробное рассмотрение новых средств в версии C# 4.0, в том числе PLINQ, библиотеку TPL, именованные и необязательные аргументы, динамический тип данных и многое другое- Сотни простых и понятных примеров программ с комментариями.- Самый полный источник информации по C#Благодаря поддержке параллельного языка интегрированных запросов (PLINQ) и библиотеки распараллеливания задач (TPL) версия 4.0 стала новой вехой в программировании на C#, и поэтому Герберт Шилдт, автор лучших книг по программированию, обновил и расширил свое классическое руководство, чтобы охватить в нем эти и другие нововведения. В книге подробно описываются языковые средства C#, даются профессиональные рекомендации и приводятся сотни примеров программ, охватывающих все аспекты программирования на C#, включая синтаксис, ключевые слова и основные библиотеки, не говоря уже о таких новшествах, как PLINQ, TPL, динамический тип данных, а также именованные и необязательные аргументы.Это необходимое каждому программирующему на C# справочное руководство написано простым и доступным языком, благодаря которому Герберт Шилдт стал таким популярным. В книге найдут ответы на насущные вопросы по C# как начинающие, так и опытные программисты.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Перейти на страницу:

Как видите, обработчик вызывается лишь в том случае, если событие SomeEvent неявляется пустым. А поскольку интерес к событию должен быть зарегистрирован в других частях программы, чтобы получать уведомления о нем, то метод OnSomeEvent()может быть вызван до регистрации любого обработчика события. Но во избежаниевызова по пустой ссылке делегат события должен быть проверен, чтобы убедиться втом, что он не является пустым.

В классе EventDemo создается обработчик событий Handler(). В данном простомпримере обработчик событий просто выводит сообщение, но другие обработчикимогут выполнять более содержательные функции. Далее в методе Main() создаетсяобъект класса события MyEvent, a Handler() регистрируется как обработчик этогособытия, добавляемый в список.MyEvent evt = new MyEvent();// Добавить метод Handler() в список событий.evt.SomeEvent += Handler;

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

И наконец, событие запускается, как показано ниже.// Запустить событие.evt.OnSomeEvent();

Вызов метода OnSomeEvent() приводит к вызову всех событий, зарегистрированных обработчиком. В данном случае зарегистрирован только один такой обработчик,но их может быть больше, как поясняется в следующем разделе.Пример групповой адресации события

Как и делегаты, события поддерживают групповую адресацию. Это дает возможность нескольким объектам реагировать на уведомление о событии. Ниже приведенпример групповой адресации события.// Продемонстрировать групповую адресацию события.using System;// Объявить тип делегата для события.delegate void MyEventHandler();// Объявить делегат, содержащий событие.class MyEvent { public event MyEventHandler SomeEvent; // Этот метод вызывается для запуска события. public void OnSomeEvent() { if(SomeEvent != null) SomeEvent(); }}class X { public void Xhandler() { Console.WriteLine("Событие получено объектом класса X"); }}class Y { public void Yhandler() { Console.WriteLine("Событие получено объектом класса Y"); }}class EventDemo2 { static void Handler() { Console.WriteLine("Событие получено объектом класса EventDemo"); } static void Main() { MyEvent evt = new MyEvent(); X xOb = new X(); Y yOb = new Y(); // Добавить обработчики в список событий. evt.SomeEvent += Handler; evt.SomeEvent += xOb.Xhandler; evt.SomeEvent += yOb.Yhandler; // Запустить событие. evt.OnSomeEvent(); Console.WriteLine(); // Удалить обработчик. evt.SomeEvent -= xOb.Xhandler; evt.OnSomeEvent(); }}

При выполнении кода этого примера получается следующий результат.Событие получено объектом класса EventDemoСобытие получено объектом класса XСобытие получено объектом класса YСобытие получено объектом класса EventDemoСобытие получено объектом класса Y

В данном примере создаются два дополнительных класса, X и Y, в которых такжеопределяются обработчики событий, совместимые с делегатом MyEventHandler.Поэтому эти обработчики могут быть также включены в цепочку событий. Обратитевнимание на то, что обработчики в классах X и Y не являются статическими. Это означает, что сначала должны быть созданы объекты каждого из этих классов, а затем вцепочку событий должны быть введены обработчики, связанные с их экземплярами.Об отличиях между обработчиками экземпляра и статическими обработчиками речьпойдет в следующем разделе.Методы экземпляра в сравнении со статическими методами в качестве обработчиков событий

Методы экземпляра и статические методы могут быть использованы в качествеобработчиков событий, но между ними имеется одно существенное отличие. Когдастатический метод используется в качестве обработчика, уведомление о событии распространяется на весь класс. А когда в качестве обработчика используется метод экземпляра, то события адресуются конкретным экземплярам объектов. Следовательно,каждый объект определенного класса, которому требуется получить уведомление о событии, должен быть зарегистрирован отдельно. На практике большинство обработчиков событий представляет собой методы экземпляра, хотя это, конечно, зависит отконкретного приложения. Рассмотрим применение каждой из этих двух разновидностей методов в качестве обработчиков событий на конкретных примерах.

В приведенной ниже программе создается класс X, в котором метод экземпляраопределяется в качестве обработчика событий. Это означает, что каждый объект классаX должен быть зарегистрирован отдельно, чтобы получать уведомления о событиях.Для демонстрации этого факта в данной программе производится групповая адресация события трем отдельным объектам класса X./* Уведомления о событиях получают отдельные объекты, когда метод экземпляраиспользуется в качестве обработчика событий. */using System;// Объявить тип делегата для события.delegate void MyEventHandler();// Объявить класс, содержащий событие.class MyEvent { public event MyEventHandler SomeEvent; // Этот метод вызывается для запуска события. public void OnSomeEvent() { if(SomeEvent != null) SomeEvent(); }}class X { int id; public X(int x) { id = x; } // Этот метод экземпляра предназначен в качестве обработчика событий. public void Xhandler() { Console.WriteLine("Событие получено объектом " + id); }}class EventDemo3 { static void Main() { MyEvent evt = new MyEvent(); X o1 = new X(1); X o2 = new X(2); X o3 = new X(3); evt.SomeEvent += o1.Xhandler; evt.SomeEvent += o2.Xhandler; evt.SomeEvent += o3.Xhandler; // Запустить событие. evt.OnSomeEvent(); }}

Выполнение кода из этого примера приводит к следующему результату.Событие получено объектом 1Событие получено объектом 2Событие получено объектом 3

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

С другой стороны, когда в качестве обработчика событий используется статическийметод, события обрабатываются независимо от какого-либо объекта, как демонстрируется в приведенном ниже примере программы./* Уведомления о событии получает класс, когда статический метод используется в качестве обработчика событий. */using System;// Объявить тип делегата для события.delegate void MyEventHandler();// Объявить класс, содержащий событие.class MyEvent { public event MyEventHandler SomeEvent; // Этот метод вызывается для запуска события. public void OnSomeEvent() { if(SomeEvent != null) SomeEvent(); }}class X { /* Этот статический метод предназначен в качестве обработчика событий. */ public static void Xhandler() { Console.WriteLine("Событие получено классом."); }}class EventDemo4 { static void Main() { MyEvent evt = new MyEvent(); evt.SomeEvent += X.Xhandler; // Запустить событие. evt.OnSomeEvent(); }}

При выполнение кода этого примера получается следующий результат.Событие получено классом.

Обратите в данном примере внимание на то, что объекты класса X вообще несоздаются. Но поскольку Xhandler() является статическим методом класса X, тоон может быть привязан к событию SomeEvent и выполнен при вызове методаOnSomeEvent().Применение аксессоров событий

В приведенных выше примерах события формировались в форме, допускавшей автоматическое управление списком вызовов обработчиков событий, включая добавление и удаление обработчиков событий из списка. Поэтому управление этим спискомне нужно было организовывать вручную. Благодаря именно этому свойству такие события используются чаще всего. Тем не менее организовать управление списком вызовов обработчиков событий можно и вручную, чтобы, например, реализовать специальный механизм сохранения событий.

Для управления списком обработчиков событий служит расширенная форма оператора event, позволяющая использовать аксессоры событий. Эти аксессоры предоставляют средства для управления реализацией подобного списка в приведеннойниже форме.event делегат_события имя_события { add { // Код добавления события в цепочку событий. } remove { // Код удаления события из цепочки событий. }}

Перейти на страницу:
Комментариев (0)
название