Чтение онлайн

на главную

Жанры

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

public delegate void TestEvent;

public class Tester {

 public event TestEvent testEvent;

 Tester { }

 public void Perform {

testEvent;

 }

 public class Client {

Client {

Tester tester = new Tester;

TestEvent a = new TestEvent(Callback1); // сначала создать делегата

tester.testEvent += a; //
затем добавить его

tester.testEvent += new Test(CallBack2); // или можно сделать это

// за один проход

tester.testEvent += new Test(Callback3);

tester.testEvent += new Test(Callback4);

tester.Perform;

}

public void CallBack1 {

// уведомить через e-mail)

}

public void CallBack2 {

// послать факсы

}

public void CallBack3 {

// послать беспроводное сообщение

}

public void CallBack4 {

// сохранить в журнале

}

 }

}

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

Notify
:

public static void Notify(string i) {

 Console.WriteLine(i);

}

Этот метод использует такую же сигнатуру, что и приемник событий класса

Properties
. В методе
Main
можно зарегистрировать метод
Notify
и задать условно ошибку, чтобы протестировать событие:

Properties props = new Properties("hello"); // зарегистрировать обработчик событий

props.ExceptionEventListener += new ExceptionEventListener(test);

p["Aged"] = "35"; // неправильный ключ используется

// для моделирования ошибки

Исключения

Исключения в C# на первый взгляд являются такими же, как в Java. Инструкции C#

try-catch
и
try-catch-finally
работают подобно своим аналогам в Java (смотрите раздел о ключевых словах). Однако в C# нельзя использовать инструкцию
throws
, поэтому невозможно указать вызывающей стороне, что некоторый код в методе может порождать исключение. Также имеется
try-finally
, который не подавляет порожденные исключения, но предлагает блок
finally
, выполняющий после порождения исключения, чтобы произвести очистку.

Порождение исключений делается с помощью инструкции

throw
. Например, чтобы
породить
SystemException
, используется код
throw new SystemException (<arg-list>);
. Это полностью совпадает c тем, как исключения порождается в Java. Требуется только инструкция
throws
и подходящий класс исключения. Далее представлен список некоторых стандартных классов исключений, предоставляемых средой выполнения .NET. Так же как в Java, их функциональность отражается в данных им именах:

□ 

Exception
— базовый класс для всех объектов исключений.

□ 

SystemException
— базовый класс для всех ошибок, создаваемых во время выполнения.

□ 

IndexOutOfRangeException
возникает, когда индекс массива во время выполнения оказывается вне границ заданного диапазона.

□ 

NullReferenceException
порождается, когда во время выполнения ссылаются на
null
.

□ 

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

□ 

ArgumentException
— базовый класс всех исключений для аргументов.

□ 

ArgumentNullException
порождается если аргумент задан как
null
, когда это недопустимо.

□ 

InteropException
является базовым классом для исключений, которые возникают или направлены на среды вне CLR.

Одним исключением, которое возникает независимо от того, будет ли оно специально порождаться или нет, является

System.OverflowException
, связанное с вычисленными результатами, превосходящими диапазон значений типа данных переменной результата. Инструкции
checked
и
unchecked
могут инициировать или подавлять связанные с этим исключения. Дополнительная информация о
checked
и
unchecked
находится в разделе данного приложения о ключевых словах.

Условная компиляция

Препроцессор в C# эмулируется. Он выполняется как отдельный процесс, прежде чем компилятор начнет свою работу. Поддерживаемые здесь директивы больше всего соответствуют C++, чем какому-либо другому языку. Конечно, в Java не существует эквивалентов функциональности, описанных в этом разделе. Разрешается определять символы, которые проверяются с помощью простых условных директив. Те, которые оказываются

true
, включаются и компилируются, иначе код игнорируется. Определение символа может происходить двумя способами. Прежде всего с использованием ключа компилятора
/define
, за которым следует двоеточие и определяемый символ, например:

csc /define:TEST_TEST samples.cs

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

#define
. В этом случае директива должна появиться раньше, чем что-либо другое, и применяется ко всем лексемам в области действия файла. Здесь перечислены допустимые условные директивы:

□ 

#if
используется для проверки существования символа

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

Эффект Фостера

Аллен Селина
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Эффект Фостера

Жена моего брата

Рам Янка
1. Черкасовы-Ольховские
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Жена моего брата

Штуцер и тесак

Дроздов Анатолий Федорович
1. Штуцер и тесак
Фантастика:
боевая фантастика
альтернативная история
8.78
рейтинг книги
Штуцер и тесак

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Виконт. Книга 4. Колонист

Юллем Евгений
Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.50
рейтинг книги
Виконт. Книга 4. Колонист

Перерождение

Жгулёв Пётр Николаевич
9. Real-Rpg
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Перерождение

Имперец. Том 1 и Том 2

Романов Михаил Яковлевич
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 1 и Том 2

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Смерть может танцевать 4

Вальтер Макс
4. Безликий
Фантастика:
боевая фантастика
5.85
рейтинг книги
Смерть может танцевать 4

Кодекс Охотника. Книга XVI

Винокуров Юрий
16. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVI

Утопающий во лжи 3

Жуковский Лев
3. Утопающий во лжи
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Утопающий во лжи 3