Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Объявление, создание экземпляра и использование делегата
В языке C# версии 1.0 и более новой версии делегаты можно объявлять как показано ниже:
В языке C# версии 2.0 и более поздней версии также существует возможность использования анонимного метода для объявления и создания экземпляра делегата при помощи упрощенного синтаксиса:
В языке C# версии 3.0 и более новой версии делегаты можно также объявлять и создавать их экземпляры при помощи лямбда-выражения: Дополнительные сведения содержатся в разделе Лямбда-выражения. Следующий пример демонстрирует объявление, создание экземпляра и использование делегата. Класс BookDB инкапсулирует базу данных книжного магазина, в котором ведется база данных книг. Он предоставляет метод ProcessPaperbackBooks, который находит все книги в мягкой обложке по базе данных и вызывает делегат для каждой книги. Используемый тип delegate имеет имя ProcessBookDelegate. Класс Test использует этот класс для печати заголовков и средней цены книг в мягкой обложке. Использование делегата способствует правильному разделению функций между базой данных книжного магазина и клиентским кодом. Клиентскому коду неизвестен порядок хранения книг и то, как код книжного магазина выполняет поиск книг в мягкой обложке. Коду книжного магазина неизвестно о выполняемой обработке книг с мягкой обложкой после их нахождения.
Example
Пример
ß----
// Using the Bookstore classes: namespace BookTestClient { using Bookstore; // Class to total and average prices of books: class PriceTotaller { int countBooks = 0; decimal priceBooks = 0.0m;
internal void AddBookToTotal(Book book) { countBooks += 1; priceBooks += book.Price; } internal decimal AveragePrice() { return priceBooks / countBooks; } } // Class to test the book database: class TestBookDB { // Print the title of the book. static void PrintTitle(Book b) { System.Console.WriteLine(" {0}", b.Title); } // Execution starts here. static void Main() { BookDB bookDB = new BookDB(); // Initialize the database with some books: AddBooks(bookDB); // Print all the titles of paperbacks: System.Console.WriteLine("Paperback Book Titles:"); // Create a new delegate object associated with the static // method Test.PrintTitle: bookDB.ProcessPaperbackBooks(PrintTitle); // Get the average price of a paperback by using // a PriceTotaller object: PriceTotaller totaller = new PriceTotaller(); // Create a new delegate object associated with the nonstatic // method AddBookToTotal on the object totaller: bookDB.ProcessPaperbackBooks(totaller.AddBookToTotal); System.Console.WriteLine("Average Paperback Book Price: ${0:#.##}", totaller.AveragePrice()); } // Initialize the book database with some test books: static void AddBooks(BookDB bookDB) { bookDB.AddBook("The C Programming Language", "Brian W. Kernighan and Dennis M. Ritchie", 19.95m, true); bookDB.AddBook("The Unicode Standard 2.0", "The Unicode Consortium", 39.95m, true); bookDB.AddBook("The MS-DOS Encyclopedia", "Ray Duncan", 129.95m, false); bookDB.AddBook("Dogbert's Clues for the Clueless", "Scott Adams", 12.00m, true); } } }
ß-----
Robust Programming · Declaring a delegate. The following statement declares a new delegate type.
Each delegate type describes the number and types of the arguments, and the type of the return value of methods that it can encapsulate. Whenever a new set of argument types or return value type is needed, a new delegate type must be declared. · Instantiating a delegate. After a delegate type has been declared, a delegate object must be created and associated with a particular method. In the previous example, you do this by passing the PrintTitle method to the ProcessPaperbackBooks method as in the following example:
This creates a new delegate object associated with the static method Test.PrintTitle. Similarly, the non-static method AddBookToTotal on the object totaller is passed as in the following example:
In both cases a new delegate object is passed to the ProcessPaperbackBooks method. After a delegate is created, the method it is associated with never changes; delegate objects are immutable. · Calling a delegate. After a delegate object is created, the delegate object is typically passed to other code that will call the delegate. A delegate object is called by using the name of the delegate object, followed by the parenthesized arguments to be passed to the delegate. Following is an example of a delegate call:
A delegate can be either called synchronously, as in this example, or asynchronously by using BeginInvoke and EndInvoke methods.
Надежное программирование · Объявление делегата. Следующий оператор объявляет новый типа делегата.
Каждый тип делегата описывает число и типы аргументов, а также тип возвращаемого значения методов, которые могут быть им инкапсулированы. Каждый раз, когда требуется новый набор типов аргументов или тип возвращаемого значения, необходимо объявить новый тип делегата.
· Создание экземпляра делегата После объявления типа делегата необходимо создать объект делегата и связать его с определенным методом. В предыдущем примере это выполняется путем передачи метода PrintTitle в метод ProcessPaperbackBooks, как показано в следующем примере:
Это создает новый объект делегата, связанный со статическим методом Test.PrintTitle. Подобным образом передается не статический метод AddBookToTotal объекта totaller, как показано в следующем примере:
В обоих случаях новый объект делегата передается в метод ProcessPaperbackBooks. После создания делегата метод, с которым он связан, никогда не изменится; объекты делегатов являются неизменяемыми. · Вызов делегата. После создания объекта делегата, он как правило передается в другой код, который вызовет делегат. Объект делегата вызывается при помощи имени объекта делегата, после которого следуют параметризованные аргументы, передаваемые в делегат. Ниже приведен пример вызова делегата.
Делегат может быть вызван синхронно (как в этом примере), или асинхронно при помощи методов BeginInvoke и EndInvoke.
Events Events enable a class or object to notify other classes or objects when something of interest occurs. The class that sends (or raises) the event is called the publisher and the classes that receive (or handle) the event are called subscribers. In a typical C# Windows Forms or Web application, you subscribe to events raised by controls such as buttons and list boxes. You can use the Visual C# integrated development environment (IDE) to browse the events that a control publishes and select the ones that you want to handle. The IDE automatically adds an empty event handler method and the code to subscribe to the event. Events Overview Events have the following properties: · The publisher determines when an event is raised; the subscribers determine what action is taken in response to the event. · An event can have multiple subscribers. A subscriber can handle multiple events from multiple publishers. · Events that have no subscribers are never called. · Events are typically used to signal user actions such as button clicks or menu selections in graphical user interfaces. · When an event has multiple subscribers, the event handlers are invoked synchronously when an event is raised. · Events can be used to synchronize threads. · In the.NET Framework class library, events are based on the EventHandler delegate and the EventArgs base class.
События События позволяют классу или объекту уведомлять другие классы или объекты о возникновении каких-либо ситуаций. Класс, отправляющий (или вызывающий) событие, называется издателем, а классы, принимающие (или обрабатывающие) событие, называются подписчиками. В C# в стандартном приложении Windows Forms или веб-приложении пользователь подписывается на события, вызываемые элементами управления, такими как кнопки и поля со списками. Для просмотра событий, публикуемых элементом управления, и выбора некоторых из них для обработки можно воспользоваться средой IDE Visual C#. IDE автоматически добавит пустой метод обработчика событий и код, необходимый для подписки на событие. Общие сведения о событиях События имеют следующие свойства. · Издатель определяет момент вызова события, подписчики определяют предпринятое ответное действие. · У события может быть несколько подписчиков. Подписчик может обрабатывать несколько событий от нескольких издателей. · События, не имеющие подписчиков, никогда не вызываются.
· Обычно события используются для оповещения о действиях пользователя, таких как нажатия кнопок или выбор меню и их пунктов в графическом пользовательском интерфейсе. · Если событие имеет несколько подписчиков, то при его возникновении происходит синхронный вызов обработчиков событий. Сведения об асинхронном вызове событий см. в разделе Асинхронный вызов синхронных методов. · События можно использовать для синхронизации потоков. · В библиотеке классов.NET Framework в основе событий лежит делегат EventHandler и базовый класс EventArgs.
|
||||||||||||||||||||
Последнее изменение этой страницы: 2017-01-19; просмотров: 113; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.106.241 (0.022 с.) |