|
Программирование >> Обработка исключительных ситуаций
else error = true; public bool error int[] a; int length; false; откр1т1й признак ошибки закр1т1й массив закрытая размерность class Classl { static void MainO int n = 100; SafeArray sa for ( int i = { = new SafeArray( n ); 0; i < n; ++i ) создание объекта sa[i] = i * 2; Console.WriteC sa[i] ); 111 использование индексатора 112 использование индексатора if ( sa.error ) Console.WriteC Бгли ошибки! ); 11з листинга видно, что индексаторы описываются аналогично свойствам. Благодаря применению индексаторов с объектом, заключающим в себе массив, можно работать так же, как с обычным массивом. Если обращение к объекту встречается в левой части оператора присваивания (оператор 1) , автоматически вызывается метод get. Если обращение выполняется в составе выражения (оператор 2), вызывается метод set. В классе SafeArray принята следующая стратегия обработки ошибок: если при попытке записи элемента массива его индекс или значение заданы неверно, значение элементу не присваивается; если при попытке чтения элемента индекс не зходит в допустимый диапазон, возвращается 0; в обоих случаях формируется значение открытого поля error, равное true. ПРИМЕЧАНИ Е- Проверка значения поля error может быть выполнена после какого-либо блока, предназначенного для работы с массивом, как в приведенном примере, или после каждого подозрительного действия с массивом (это может замедлить выполнение программы). Такой способ обработки ошибок не является единственно возможным. Правильнее обрабатывать подобные ошибки с помощью механизма исключений, соответствующий пример будет приведен далее в этой главе. Вообще говоря, индексатор не обязательно должен быть связан с каким-либо знутренним полем данных. В листинге 7.4 приведен пример класса Pow2, единственное назначение которого - формировать степень числа 2. Поле у вывести на экран аналогичным образом не удастся: оно является закрытым, то есть недоступно извне (из класса Classl). Поскольку значение этому полю явным образом не присвоено, среда присваивает ему значение ноль. внимани е- Все поля сначала автоматически инициализируются нулем соответствующего типа (например, полям типа int присваивается 0, а ссылкам на объекты - значение nu 11). После этого полю присваивается значение, заданное при его явной инициализации. Задание начальных значений для статических полей выполняется при инициализации класса, а обычных - при создании экземпляра. Поля со спецификатором readonly предназначены только для чтения. Установить значение такого поля можно либо при его описании, либо в конструкторе (конструкторы рассматриваются далее в этой главе). Методы Метод - это функциональный элемент класса, который реализует вычисления > или другие действия, выполняемые классом или экземпляром. Методы опреде- ляют поведение класса. Метод представляет собой законченный фрагмент кода, к котором} можно обратиться но имени. Он описывается один раз, а вызываться может столько раз, сколько необходимо. Один и тот же метод может обрабатывать различные данные, переданные ему в качестве аргументов. Синтаксис метода: £ [атрибуты ] [ спецификаторы ] тип имяметода ( [ параметры ] ) тело метода *р Рассмотрим основные элементы описания метода. Первая строка представляет собой заголовок метода. Тело метода, задающее действия, выполняемые методом, чаще всего представляет собой блок - последовательность операторов в фигур- ных скобках1. При описании методов можно использовать спецификаторы 1-7 из табл. 5.2, имеющие тот же смысл, что и для полей, а также спецификаторы virtual, sealed, override, abstract и extern, которые будут рассмотрены по мере необходимости. Чаше всего для методов задается спецификатор доступа public, ведь методы составляют интерфейс класса - то, с чем работает пользователь, поэтому они должны быть доступны. внимани е- Статические (static) методы, или методы класса, можно вызывать, не создавая экземпляр объекта. Именно таким образом используется метод Main. Позже мы увидим, что для методов некоторых типов вместо тела используется просто точка с запятой. Листинг 7.4. Индексатор без массива using System; namespace ConsoleApplicationi class Pow2 { public ulong this[int i] if ( { i >= 0 ) else ulong res for ( int k = unchecked return res; return 0; 0; k < i; k++ ) 2; } цикл получения степени III class Classl { static void MainO int n = 13; Pow2 pow2 = new Pow2(); for ( int i = 0; i < n; ++i ) Console.WriteLineC {0}\t{l}O i, pow2[i] ); Оператор 1 выполняется в непроверяемом контексте1, для того чтобы исклют ние, связанное с переполнением, не генерировалось. В принципе, данная програ ма работает и без этого, но если поместить класс Pow2 в проверяемый контек при значении, превышающем допустимый диапазон для типа ulong, возник? исключение. Результат работы программы: 16 32 64 Это понятие рассмотрено в разделе Введение в исключения (см. с. 46).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |