Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы_ТП

.pdf
Скачиваний:
9
Добавлен:
21.05.2015
Размер:
880.4 Кб
Скачать

Вот как выглядят результаты выполнения этой программы :

Unchecked -результат: 1

Unchecked -результат: 113

Checked -результат: 14

System.OverflowException: Arithmetic operation resulted in an overflow,

atCheckedBlocks.Main()

17. Использование оператора new

Формат оператора new таков:

переменная_типа_класса = new имя_класса() ;

элемент переменная_типа_класса означает имя создаваемой переменнойтипа класса, под элементом имя_класса понимается имяреализуемого в объекте класса. Имя класса вместе со следующей за ним парой круглых скобок — это ни что иное, как конст руктор реализуемого класса. Если в классеконструктор не определен явным образом, оператор new будет использовать конструктор по умолчанию, который предоставляется средствами языка С#. Таким образом,оператор new можно использовать для создания объекта любого "классового" типа.

Допустимо использовать оператор new и с типами значений.

Вот пример:

inti = newint();

В этом случае вызывается конструктор по умолчанию для типа int,

который инициализирует переменную i нулем.

using System;

classnewValue {

public static void Main() {

inti = new int(); // Инициализация iнулем.

Console.WriteLine(" Значениепеременной i равно: " + i);

}}

18. Использованние событийных средств доступ

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

Чтобы управлять списком обработчиков событий, используйте вторую формуevent-инструкции, которая позволяет использовать средства доступа к событиям. Этисредства доступа дают возможность управлять реализацией списка обработчиков событий. Упомянутая форма имеет следующий вид:

event событийный_делегат имя__события {

add {

// Код добавления события в цепочку событий.

}

remove {

// Код удаления события из цепочки событий.

}

}

Эта форма включает два средства доступа к событиям: add и remove. Средстводоступа add вызывается в случае, когда с помощью оператора "+=" в цепочку событийдобавляется новый обработчик, а средство доступа remove вызывается, когда с помощью оператора " - = " из цепочки событий удаляется новый обработчик.

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

Например, для этого вы могли бы использовать массив, стек или очередь.

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

using System;

// Объявляем делегат для события,

delegate void MyEventHandler();

//Объявляем класс события для хранения трех

//обработчиковсобытий ,

class MyEvent {

MyEventHandler[] evnt = new MyEventHandler[3];

public event MyEventHandler SomeEvent { // Добавляемобработчиксобытиявсписок , add {

int i;

for(i=0; i < 3;i++) if(evnt[i] == null) { evnt[i] - value; break;

}

if (i == 3)

Console.WriteLine(

"Список обработчиков событий полон.");

}

// Удаляем обработчик события из списка, remove {

int i ;

for(i=0; i < 3;i++) if(evnt[i] == value){ evnt[i] = null; break;

}

if (i == 3)Console.WriteLine(" Обработчиксобытияненайден .");

}}

// Этот метод вызывается для генери рования событий,

public void OnSomeEvent() {

for(int i=0; i < 3; i++)

if(evnt[i] !== null) evnt[i]();

}}

//Создаем классы, которые используют

//делегат MyEventHandler.

class W {

public void WhandlerO {

Console.WriteLine("Событие получено объектом W.")

}}

class X {

public void XhandlerO {

Console.WriteLine("Событие получено объектом X.");

}}

class Y {

public void YhandlerO {

Console.WriteLine("Событие получено объектом Y.");

}}

class Z {

public void ZhandlerO {

Console.WriteLine("Событие получено объектом Z.")

}}

class EventDemo {

public static void Main() {

MyEvent evt = new MyEvent();

W wOb = new W();

X xOb = new X();

Y yOb = new Y ();

Z zOb = new Z ();

// Добавляем обработчики в список.

Console.WriteLine("Добавление обработчиков событий."); evt.SomeEvent += new MyEventHandler(wOb.Whandler);

evt.SomeEvent += new MyEventHandler(xOb.Xhandler); evt.SomeEvent += new MyEventHandler(yOb.Yhandler);

// Этот обработчик сохранить нельзя — список полон, evt.SomeEvent += new MyEventHandler(zOb.Zhandler); Console.WriteLine();

//Генерируемсобытия. evt.OnSomeEvent(); Console.WriteLine();

//Удаляем обработчик из списка.

Console.WriteLine("Удаляем обработчик xOb.Xhandler."); evt.SomeEvent -= new MyEventHandler(xOb.Xhandler);

evt.OnSomeEvent(); Console.WriteLine();

// Пытаемся удалить его еще раз.

Console.WriteLine(

"Попытка повторно удалить обработчик xOb.Xhandler.");

evt.SomeEvent -= new MyEventHandler(xOb.Xhandler); evt.OnSomeEvent();

Console.WriteLine();

// Теперьдобавляемобработчик Zhandler.

Console.WriteLine(" Добавляемобработчик zOb.Zhandler.") evt. SomeEvent += new MyEventHandler (zOb. Z*handler) ; evt.OnSomeEvent();

}}

Вот результаты выполнения программы:

Добавление обработчиков событий.

Список обработчиков событий полон.

Событие получено объектом W.

Событие получено объектом X.

Событие получено объектом Y.

Удаляем обработчик xOb.Xhandler.

Событие получено объектом W.

Событие получено объектом Y.

Попытка повторно удалить обработчик xOb.Xhandler.

Обработчик события не найден.

Событие получено объектом W.

Событие получено объектом Y.

Добавляем обработчик zOb.Zhandler.

Событие получено объектом W.

Событие получено объектом Z.

Событие получено объектом Y.

Сначала определяется делегат обработчика события

MyEventHandler. Код класса MyEvent, как показано в следующейинструкции, начинается с определения трехэлементного массива обработчиков событий evnt.

MyEventHandler[] evnt = new MyEventHandler[3];

Этот массив предназначен для хранения обработчиков событий, которые добавлены в цепочку событий . Элементы массива evnt инициализируются null-значениямипо умолчанию.

Приведем event-инструкцию, в которой используются событийные средства доступа.

public event MyEventHandler SomeEvent {

// Добавляем обработчик события в список,

add {

int i ;

for(i=0; i < 3;i++)

if(evnt[i] == null) {evnt[ij = value;

break;

}

if (i == 3)Console.WriteLine(" Списокобработчиковсобытийполон ");

}

// Удаляем обработчик события из списка,

remove {

int i;

for(i=0; i < 3; i++)

if(evnt[i] == value) {

evnt[i] = null;

break;

}

if (i == 3)

Console.WriteLine(" Обработчиксобытияненайден .");

}}

При добавлении в список обработчика событий вызывается addсредство, и ссылка на этот обработчик (содержащаяся в параметре value) помещается в первый встретившийся неиспользуемый элемент массива evnt. Если свободных элементов нет,выдается сообщение об ошибке. Поскольку массив evnt рассчитан на хранение лишьтрех элементов, он может принять только три обработчика событий. При удалениизаданного обработчика событий вызывается remove-средство , и в массиве evnt выполняется поиск ссылки на обработчик, переданной в параметре value. Если ссылканайдена, в соответствующий элемент массива помещается значение null , что равнозначно удалению обработчика из списка.При генерировании события вызывается метод OnSomeEvent(). Он в цикле просматривает массив evnt, по очереди вызывая каждый обработчик событий.

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

19. Класс System.Exception

В С# исключения представляются классами. Все классы исключений должны быть выведены из встроенного класса исключений Exception, который является частью пространства имен System. Таким образом, все исключения — подклассы класса Exception.

ИзклассаException выведеныклассыSystemException иApplicationExc eption. Они поддерживают две общие категории исключений, определенные в С#: те, которые генерируются С# -системой динамического управления, или общеязыковым средством управления

(CommonLanguageRuntime — CLR), и те, которые генерируются прикладными программами. Но ни класс SystemException , ни класс ApplicationException не привносят ничего нового в дополнение к членам класса Exception. Они просто определяют вершины двух различных иерархий классов исключений. С# опреде ляет встроенные исключения, которые выводятся из класса SystemException . Например, при попытке выполнить деление на нуль генерируется исключение класса DivideByZeroException . Вы сможете создавать собственные классы исключений, выводя их из класса ApplicationException.

20. Ключевое слово this

Каждый объект содержит свой экземпляр полей класса. Методы находятся в па мяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов нестатических экземпляров с полями именно того объекта, для которого они были вызваны. Для этого в любой нестатический метод автоматически передается скрытый параметр this, в котором хранится ссылка на вызвавший функцию экземпляр.

В явном виде параметр this применяется для того, чтобы возвратить из метода ссылку на вызвавший объект, а также для идентификации поля в случае, если его имя совпадает с именем параметра метода, например:

class Demo

{ double y;

public Demo T()

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]