Путь разработчика    

Как сделать класс с определением и повышением событий в C#

Рекомендуем: Почему у разных моделей шипованных шин разное количество шипов
eda2480d

В этом примере используется класс BankAccount для управления банковским счетом (и для определения способов и событий события). Если программа пытается удалить больше денег с учетной записи, чем ее текущий баланс, объект BankAccount вызывает событие Overdrawn. Событие включает в себя два параметра: объект с именем sender, который содержит ссылку на объект BankAccount, который поднимает событие, и объект OverdrawnArgs.

Объект OverdrawnArgs содержит два полезных свойства. Свойство DebitAmount указывает сумму, которую программа пытается удалить из учетной записи. Свойство Allow - это логическое значение, которое программа может установить в true, чтобы сообщить объекту BankAccount обработать дебет, даже если это даст учетную запись отрицательный баланс.

Программа должна выполнить пять основных шагов для определения и повышения событий.

Объект, который класс передает обработчику события, должен наследовать от EventArgs. Следующий код показывает класс OverdrawnArgs, используемый в этом примере.

Python

Этот класс предоставляет сумму дебетования, которая вызывает переопределение учетной записи. Поле Boolean Allow позволяет основной программе сообщать об этом объекту, разрешать ли ему дебет, даже если это даст отрицательный баланс учетной записи.

Обратите внимание, что класс OverdrawnArgs не включает текущий баланс учетной записи. Основная программа может получить это от самого объекта BankAccount. Он не мог получить сумму дебетов таким образом, поэтому он входит в класс OverdrawnArgs.

(Для бонусных очков вы можете сделать DebitAmount свойство только для чтения. Вы можете поместить его и BankAccount в сборку и использовать internal , чтобы класс BankAccount установил значение, но не позволял основной программе установить его. Или вы можете сделать конструктор установленным значением. Обычно программисты просто оставляют этот вид свойств read-write и затем игнорируйте любые изменения, внесенные программой.)

Класс BankAccount должен определить событие. Событие указывает тип делегирования обработчика события. Вы можете явно определить тип делегата, как в следующем коде.

Python

Этот код означает, что событие Overdrawn должно обрабатываться обработчиком событий, который принимает два параметра: объект с именем sender, представляющий объект, который поднял событие, и Объект OverdrawnArgs.

В качестве альтернативы вы можете использовать предопределенный тип делегата EventHandler, как показано в следующем коде.

Python

Этот оператор примерно эквивалентен предыдущим двум операторам, которые сначала определили отдельный тип делегата.

Эта версия проще (и все дело в том, что Microsoft изобретает предопределенный тип EventHandler), так вот как это делает этот пример.

Определив событие, класс должен поднять его, когда это необходимо. Следующий код показывает, как класс BankAccount вызывает событие.

Python

В поле Balance содержится текущий баланс учетной записи.

Метод Debit - это класс, в котором класс вызывает событие. Во-первых, метод проверяет, является ли дебетование суммы меньше нуля и выдает исключение, если оно есть.

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

Если баланс недостаточен, метод вызывает событие Overdrawn. Оператор if (Overdrawn! = Null) проверяет, подписался ли какой-либо код на событие. Это странный синтаксис, но если для события не зарегистрировано обработчиков событий, то Overdrawn есть null, поэтому методу не нужно поднимать событие. На самом деле, если он пытается поднять событие, он получает исключение «Объектная ссылка, не установленная на экземпляр объекта».

Если обработчик события подписан на событие, метод создает объект OverdrawnArgs и устанавливает его DebitAmount. Затем он использует синтаксис Overdrawn (this, args), чтобы поднять событие, передав текущий объект и объект OverdrawnArgs подписанным обработчикам событий.

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

Если класс, который вы создаете, является компонентом или элементом управления, вы можете использовать отображение событий окна «Свойства» для создания обработчиков событий. В противном случае вам нужно подписаться на обработчики событий в коде.

Следующий код показывает, как основная программа инициализирует свой объект BankAccount и подписывается на событие Overdrawn этого объекта.

Python

Обработчик события Load формы создает объект BankAccount, дает баланс $ 100.00 и отображает текущий баланс.

Обработчик события Load формы создает объект BankAccount, дает баланс $ 100.00 и отображает текущий баланс.

...

Когда объект BankAccount вызывает событие Overdrawn, выполняется следующий обработчик событий Account_Overdrawn.

Python

Этот метод преобразует параметр sender в объект BankAccount. (Это первый шаг во многих обработчиках событий. Очень плохо, что предопределенный тип делегата EventHandler не принимает двух параметров типа, поэтому вы можете сделать параметр sender иметь тип BankAccount вместо object. Тогда вы можете пропустить этот шаг. К сожалению, это не так, как определено EventHandler.)

Затем обработчик события отображает окно сообщения, в котором указывается информация о транзакции и спрашивается у пользователя, разрешить ли он транзакции. Если пользователь нажимает «Да», код устанавливает поле OverdrawnArgs объекта Allow в true, чтобы объект BankAccount, который поднял событие знает, что оно должно разрешить транзакцию.

Это может показаться большим количеством шагов, но это не так уж плохо, если вы привыкнете к нему.

Источник: http://csharphelper.com/blog/2017/11/make-a-class-define-and-raise-events-in-c/



Отзывы (через Facebook):

Оставить отзыв с помощью аккаунта FaceBook:


Основы программирования в Embarcadero Delphi (Никита Культин)

Книга представляет собой практическое руководство по программированию в Embarcadero Delphi. В ней представлена технология визуального проектирования и собы...

21 06 2021 6:33:57

Delphi в примерах, играх и программах (Валерий Рубанцев)

В январе 2011 года в питерском издательстве Наука и техника вышла книга Валерия Рубанцева "Delphi в примерах, играх и программах". К сожалению, в ней не на...

20 06 2021 11:30:55

RandomAccessFile в Java

Java RandomAccessFile обеспечивает несущественный доступ к файлам. Он ведет себя как большой массив байтов, хранящихся в файловой системе. Это означает, чт...

19 06 2021 11:58:44

Распечатайте диаграмму конверсии по Цельсию в Фаренгейт в C#

Один из моих друзей повара много использует японские кулинарные книги. Поскольку печи в Соединенных Штатах показывают только температуру в градусах Фаренге...

18 06 2021 17:39:59

Массивы в C#

Массив в C#: Массив - это коллекция того же типа данных Массив может быть объявлен как фиксированный размер или динамический Массив может быть доступен по...

17 06 2021 18:31:23

Добавление метода расширения в класс Graphics в C#

По какой-то странной причине метод DrawRectangle класса Graphics не может принимать параметр RectangleF в качестве параметра. Он может принимать значения R...

16 06 2021 5:12:51

Привязать DataGrid к набору данных, содержащему несколько таблиц во время выполнения в C#

В этом примере показано, как можно привязать элемент DataGrid к DataSet, загруженному из файла MDB во время выполнения. Когда форма загружается, следующий...

15 06 2021 20:19:22

Что такое singleton класс в Java?

В объектно-ориентированном программировании шаблон Singleton ограничивает создание экземпляра класса и гарантирует, что в JVM (виртуальная машина Java) сущ...

14 06 2021 23:37:12

Рассчитайте стоимость ежемесячных инвестиций в C#

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

13 06 2021 15:33:32

Как аннотации работают на Java?

Аннотации Java используются для предоставления метаданных для Java-кода, хотя они не являются частью самой программы. Метаданные - это данные о данных. Так...

12 06 2021 5:46:38

Скачать астрономическую картину дня в C#

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

11 06 2021 4:39:32

Почему мне нужно переопределить методы equals и hashCode в Java?

В Java каждый объект имеет доступ к методу equals(), поскольку он наследуется от класса Object. Если два объекта равны в соответствии с методом equals (Obj...

10 06 2021 15:53:22

Отображение диалога выбора шрифта с кнопкой Apply в C#

Иногда приложение отображает диалоговое окно выбора шрифта с кнопкой Apply. Если вы нажмете эту кнопку, приложение покажет, как это будет выглядеть, если в...

09 06 2021 7:44:40

Получите серийный номер жесткого диска в C#

Пример Получить серийный номер тома диска в C# показывает, как вы можете найти серийный номер для тома диска, такого как C: . Однако, если вы переформатир...

08 06 2021 15:29:32

1С:Предприятие 8.0. Управление торговлей (В.Григорьева)

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

07 06 2021 3:19:12

HTML5 для веб-дизайнеров (Кит Джереми)

В HTML5 появилось много интересных тэгов, в том числе поддержка аудио и видео-файлов. Теперь вам не надо тратить время на установку плагинов для проигрыван...

06 06 2021 7:58:22

Выберите разрешение принтера в C#

В этом примере показано, как разрешить пользователю выбирать разрешение принтера. Когда вы устанавливаете принтер объекта PrintDocument, его коллекция Defa...

05 06 2021 2:54:46

Сделать владельцем рисованные всплывающие подсказки с картинками в C#

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

04 06 2021 11:25:58

Сортировка элемента управления ListView, используя все его столбцы в C#

Вы можете сделать сортировку ListView, установив для свойства Sorting значение Ascending или Descending, но это займет дополнительную работу по сортировке...

03 06 2021 23:22:44

List (список) в Python

List ( Список) в Python - один из наиболее часто используемых и очень универсальных типов данных, используемых в Python. Списки являются объектами и содержа...

02 06 2021 7:37:35

Класс FileWriter в Java

FileWriter - это представление символа Java.io. Это означает, что он может использоваться для написания символов. Он расширяет OutputStreamWriter, который...

01 06 2021 8:39:52

Как установить максимальное использование памяти для JVM?

Объем памяти, которую может использовать программа Java, зависит от ее среды. Библиотека Java Standard предоставляет следующие методы в классе выполнения....

31 05 2021 12:22:21

[Ctrl + A] Выделить весь текст в текстовом поле в C#

Часто пользователю удобно нажимать Ctrl + A, чтобы выделить весь текст в TextBox, который имеет фокус. Странно, что это не поведение по умолчанию для TextB...

30 05 2021 14:16:35

Программирование на Java и С# для студента (О. В. Герман, Ю. О Герман)

Рассмотрены основные вопросы программирования на языках JAVA и С#, включая их сравнительное описание как двух важнейших и весьма сходных прикладных платфор...

29 05 2021 22:59:46

Создайте DataTable и привяжите его к DataGridView в C#

В этом примере показано, как можно построить DataTable и привязать его к элементу управления DataGridView. A DataTable представляет собой представление в р...

28 05 2021 1:24:44

Изучаем JavaScript (Моррисон М.)

Вы готовы сделать шаг вперед в своей практике веб-программирования и перейти от верстки в HTML и CSS к созданию полноценных динамических страниц? Тогда при...

27 05 2021 5:13:23

Отображение масштабируемой карты с горячими точками в C#

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

26 05 2021 15:24:18

Каковы функции help() и dir() разные?

В Python help() - это супер полезная встроенная функция, которая может быть использована для возврата документации Python для конкретного объекта, метода,...

25 05 2021 9:26:24

Статическая синхронизация с нестатической синхронизацией в Java

Java поддерживает несколько потоков для выполнения. Это может привести к тому, что два или более потока будут обращаться к тем же полям или объектам одновр...

24 05 2021 8:31:21

Дмитрий Осипов - Delphi XE2

Настоящее издание посвящено новейшей разработке компании Embarcadero - языку Delphi XE2. Книга предоставляет читателю не только полное описание одного из с...

23 05 2021 1:24:37

Обработка исключений на Python

Что такое исключение? Исключение является нежелательным событием , которое прерывает нормальный поток программы. Это может быть ошибка программирования, пы...

22 05 2021 4:28:23

Как получить длину строки в Java

Длина() объекта String возвращает длину этой строки. Длина строки Java такая же, как и юникодные кодовые единицы строки. Синтаксис: Нет параметра для lengt...

21 05 2021 17:54:53

Чистые функции VS. Нечистые функции в JavaScript

Чистые функции всегда возвращают один и тот же результат, если одни и те же аргументы передаются. Он не зависит от какого-либо состояния или данных, которы...

20 05 2021 10:42:54

Понимание бит-масок в C#

Некоторые значения, включая некоторые свойства, определенные платформой .NET Framework, представляют собой бит-маски. Это означает, что каждый бит в значен...

19 05 2021 16:49:53

Преобразование между случаем Паскаля, верблюжьим футляром и правильным случаем метод 2 в C#

Как и предыдущий пост, Преобразование между случаем Pascal, верблюжьим футляром и правильным случаем в C# , в этом примере показано, как использовать метод...

18 05 2021 0:21:43

Используйте объект ImageAttributes для применения общих цветовых тонов к изображению в C#

В этом примере используются методы, аналогичные тем, которые описаны в post Используйте объект ImageAttributes для преобразования изображения в оттенки кра...

17 05 2021 7:12:31

События JavaScript DOM

События - это определенные действия, выполняемые конечным пользователем или самим веб-браузером. Он может запускаться в любой части документа, независимо о...

16 05 2021 7:28:11

Чтение и запись объектов в Java

Сериализация - это преобразование объекта в последовательность байтов, чтобы объект можно было легко сохранить в постоянном хранилище или потоковом потоке...

15 05 2021 21:24:31

Java Autoboxing и Unboxing

Autoboxing и Unboxing - это функции, включенные в Java 1.5, где автоматическое преобразование происходит от примитивного типа до соответствующего класса кл...

14 05 2021 18:39:25

Сделайте отображение изображений ComboBox с текстом в C#

Пример Сделать цветной дисплей ComboBox или изображения на C# показывают, как сделать созданный владельцем ComboBox, который отображает либо серию цветовых...

13 05 2021 6:43:15

Получить имя исполняемого метода в C#

В этом примере показано, как вы можете получить имя метода для текущего исполняемого метода. Обычно вам не нужно получать это имя (вы можете просто посмотр...

12 05 2021 14:10:45

Использование значений равенства для сравнения объектов шрифта в C#

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

11 05 2021 6:40:45

Почему мне нужно переопределить методы equals и hashCode в Java?

В Java каждый объект имеет доступ к методу equals(), поскольку он наследуется от класса Object. Если два объекта равны в соответствии с методом equals (Obj...

10 05 2021 5:12:39

Позвольте пользователю выбрать критерии поиска базы данных в C#

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

09 05 2021 19:23:34

Глобальные переменные в JavaScript

Как и другие языки программирования, JavaScript также имеет локальные и глобальные переменные. В JavaScript объекты и функции также являются переменными. О...

08 05 2021 1:49:52

Добавление вкладок в WPF TabControl во время выполнения в C#

При нажатии кнопки + этот пример использует следующий код для добавления вкладки в WPF TabControl с именем tabMain. Сначала код создает TabItem и добавляет...

07 05 2021 17:38:39

Что такое фильтр ввода-вывода и как его использовать в Java?

Подобно потокам ввода-вывода, потоки фильтров также используются для управления чтением данных из базового потока. Фильтрация, выполняемая потоками, зависи...

06 05 2021 6:57:13

Метод Substring в C#

Метод Substring в строке C#. Класс возвращает новую строку, которая является подстрокой этой строки. Подстрока начинается с указанного заданного индекса и...

05 05 2021 1:50:32

Получение значения переменных по имени в C#

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

04 05 2021 3:25:24

Что такое отказобезопасные и отказоустойчивые итераторы в Java

Неуправляемые итераторы Fail-Fast iterators, возвращенные большинством типов коллекций, не переносят каких-либо структурных изменений в коллекции, итерации...

03 05 2021 9:38:22

Еще:
Программирование -1 :: Программирование -2 :: Программирование -3 :: Программирование -4 :: Программирование -5 ::

И сказал Великий Программист:
«После трёх дней без программирования жизнь теряет смысл»