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

Ответы_ТП

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

}}

catch (DivideByZeroException) { // Перехватываемисключение .

Console.WriteLine(" Нанульделитьнельзя!"); return; // Возврат из catch -блока.

}

catch (IndexOutOfRangeException) {

// Перехватываем исключение.

Console.WriteLine("Нет соответствующего элемента.");

}

finally {

Console.WriteLine(" Поокончании try-блока.");

}}}

class FinallyDemo { public static void Main() { for(int i=0; i < 3;i++){

UseFinally.genException(i);

Console.WriteLine();

}}}

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

Получаем 0

На нуль делить нельзя!

По окончании try-блока.

Получаем 1

Нет соответствующего элемента.

По окончании try-блока.

Получаем 2

По окончании try-блока.

Как подтверждают результаты выполнения этой программы, независимо от итога завершения try -блока, блок finally выполняется обязательно.

14. Использование интерфейсных ссыл ок

В C# можно объявить ссылочнуюпеременную интерфейсного типа. Другими словами, можно создать переменнуюссылку на интерфейс. Такая переменная может ссылаться на любой объект, которыйреализует ее интерфейс. При вызове метода для объекта посредством интерфейснойссылки будет выполнена та версия указанного метода, которая реализована этим объектом.

Пример: Здесь используется одна и та же интерфейсная переменная-ссылка, чтобы вызывать методы для объектов как класса ByTwos, так и класса Primes.

//Демонстрация использования интерфейсных ссылок. using System;

//Определениеинтерфейса,

public interface ISeries

{

int getNextO; // Возвращает следующее число ряда. void reset(); // Выполняет перезапуск.

void setStart(int x) ; // Устанавливает начальное значение.

}}

// Используем интерфейс ISeries для генерирования последовательности четных чисел,

class ByTwos : ISeries

{

int start; int val;

public ByTwos()

{

start = 0; val = 0;

}

public int getNext()

{

val += 2; return val;

}

public void reset()

{

val = start;

}

public void setStart(int x)

{

start = x; val = start;

}}

// Используем интерфейс ISeries для построения ряда простых чисел, class Primes : ISeries

{

int start; int val;

public Primes ()

{

start = 2; val = 2;

}

public int getNext()

{

int i, j;

bool isprime;

val++;

for(i = val; i < 1000000; i++)

{

isprime = true;

for(j = 2; j < (i/j + 1); j++)

{

if((i%j)==0)

{

isprime = false; break;

}

}

if(isprime)

{

val = i; break;

}

}

return val;

}

public void reset()

{

val = start;

}

public void setStart(int x)

{

start = x; val = start;

}

class SeriesDemo2

{

public static void Main()

{

ByTwos twoOb = new ByTwos(); Primes primeOb = new Primes(); ISeries ob;

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

{

ob = twoOb;

Console.WriteLine( "Следующее четное число равно " + ob.getNext ());

ob = primeOb;

Console.WriteLine("Следующее простое число равно " + ob.getNext() );

}

}

}

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

15. Использование ключевого слова sealed

В С# предусмрена возможность предотвращения наследования класса с помощью ключевого слова sealed. Чтобы запретить наследование класса, предварите его объявление ключевым словом sealed. Рассмотрим пример sealed-класса.

SealedclassA {

//…

}

// Следующий класс создать невозможно.

class В : А { // ОШИБКА! Класс А не может иметь //наследников.

//…

}

Класс В не может быть производным от класса А, так как последний объявлен sealed -классом .

16. Использование ключевых слов checked и unchecked

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

bytea, b, result;

а = 127;

b = 127;

result = (byte)(a * b);

Здесь произведение значений а и b превышает диапазон представления значений типа byte. Следовательно, результат вычисления этого выражения вызвал переполнение для типа

переменной result .

С# позволяет управлять генерированием исключений при возникновении переполнения с помощью ключевых слов checked и unchecked. Чтобы указать, что некоторое выражение должно быть проконтролировано на предмет переполнения, используйте ключевое слово checked. А чтобы проигнорировать переполнение, используйте ключевое слово unchecked. В последнем случае результат будет усечен так, чтобы его тип соответствовал ти пу-результату выражения.

Ключевое слово checked имеет две формы. Одна проверяет конкретное выражение и называется операторной checked -формой. Другая же проверяет блок инструкций.

checked (expr)

checked {

// Инструкции, подлежащие проверке.

}

Здесь expr — выражение, которое необходимо контролировать. Если значение контролируемого выражения переполнилось, генерируется исключение типа OverflowException .

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

unchecked (expr)

unchecked {

// Инструкции, для которых переполнение игнорируется.

}

Здесь ехрr — выражение, которое не проверяется на предмет переполнения. В случае переполнения это выражение усекается.

Рассмотрим программу, которая демонстрирует использование как слова checked, так и слова unchecked.

// Использование ключевых слов checked и unchecked. usingSystem;

classCheckedDemo { publicstaticvoidMain() { bytea, b;

byte result; a = 127;

b = 127; try {

result = unchecked((byte)(a * b));

Console.WriteLine("Unchecked -результат: " + result); result = checked((byte)(a * b)); // Этаинструкция

// вызывает исключение.

Console.WriteLine("Checked -результат: " + result); // Инструкция не будет

// выполнена.

}

catch (OverflowExceptionexc ) {

// Перехватываемисключение.

Console.WriteLine(exc);

}}}

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

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

System.OverflowException: Arithmetic operation resulted in an

overflow.

atCheckedDemo.Main()

Результат непроверяемого выражения усекается. В случае разрешения проверки переполнения было бы сгенерировано исключение.

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

// дляблоковинструкций .

usingSystem;

class CheckedBlocks {

public static void Main() {

byte a, b;

byte result;

а = 127;

b = 127;

try {

unchecked {

a = 127;

b =127;

result = unchecked((byte)(a * b));

Console.WriteLine("Unchecked -результат: " + result);

a=125;

b= 5;

result = unchecked((byte)(a * b));

Console.WriteLine("Unchecked -результат: " + result);

}

checked { a = 2;

b = 7;

result = checked((byte)(a * b)); // Всевпорядке.

Console.WriteLine("Checked -результат: " + result); a = 127;

b = 127;

result = checked((byte)(a * b)); // Здесьдолжно

//бытьсгенерировано

//исключение.

Console.WriteLine("Checked -результат: " + result); // Этаинструкцияне

// выполнится.

}}

catch (OverflowExceptionexc ) {

// Перехватываемисключение.

Console .WriteLine (exc);

}}}

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