|
Программирование >> Обработка исключительных ситуаций
SafeArray al = new SafeArrayC 5, 2, -1, 1, -2 ); al.Print( Массив 1 ); SafeArray a2 = new SafeArray( 1, 0, 3 ); a2.Print( Массив 2 ); SafeArray a3 = al + a2; a3.Print( Сумма массивов 1 и 2 ); al = al + 100; al.Print( Массив 1 + 100 ); al = 100 + al; al.PrintC 100 + массив 1 ); a2 += ++a2 +1 ; a2.Print( ++a2, a2 + a2 + 1 ); 113 оторвать руки! catch ( Exception e ) { Console.WriteLine( e.Message ); Результат работы программы: Массив 1: 5 2 -1 Насси i 2: 1 0 3 Сумма массивов 1 и 2: 7 3 3 Масси J 1 + 100: 106 103 100 100 + массив 1: 206 203 200 ++а2. а2 + а2 + 1: 5 3 9 102 202 99 199 Обратите внимание: чтобы обеспечить возможность сложения с константой, операция сложения перегружена два раза для случаев, когда константа является первым и вторым операндом (операторы 2 и 1). Сложную операцию присваивания += (оператор 3) определять не требуется, да это и невозможно. При ее выполнении автоматически вызываются сначала операция В перегруженных методах для объектов применяется индексатор. Для повышения например: temp.a[i] = х + y.a[i]. Операции преобразования типа Операции преобразования типа обеспечивают возможность явного и неявног преобразования между пользовательскими типами данных. Синтаксис объявите ля операции преобразования типа: implicit operator тип ( параметр ) неявное преобразование explicit operator тип ( параметр ) явное преобразование Эти операции выполняют преобразование из типа параметра в тип, указанны в заголовке операции. Одним из этих типов должен быть класс, для которог определяется операция. Таким образом, операции выполняют преобразовани либо типа класса к другому типу, либо наоборот. Преобразуемые типы не дол ны быть связаны отношениями наследования1. Примеры операций преобразовг ния типа для класса Monster, описанного в главе 5: public static implicit operator int( Monster m ) return m.health: public static explicit operator Monster( int h ) return new Monster( h. 100, Fromlnt ); Ниже приведены примеры использования этих преобразований в программе. Н надо искать в них смысл, они просто иллюстрируют синтаксис: Monster Masha = new Monster( 200, 200, Masha ); int i = Masha; неявное преобразование Masha = (Monster) 500; явное преобразование Неявное преобразование выполняется автоматически: при присваивании объекта переменной целевого типа, как в примере; при использовании объекта в выражении, содержащем переменные целевого тип; при передаче объекта в метод на место параметра целевого типа; при явном приведении типа. 1 Следовательно, нельзя определять преобразования к типу object и наоборот, впрочел они уже определены без нашего участия. сложения, а потом присваивания. В целом же оператор 3 демонстрирует недопустимую манеру программирования, поскольку результат его выполнения неочевиден. ПРИМЕЧАНИЕ---- Вложенные типы Деструкторы В С# существует специальный вид метода, называемый деструктором. Он вызывается сборщиком мусора непосредственно перед удалением объекта из памяти. В деструкторе описываются действия, гарантирующие корректность последующего удаления объекта, например, проверяется, все ли ресурсы, используемые объектом, освобождены (файлы закрыты, удаленное соединение разорвано и т. п.). Синтаксис деструктора: [ атрибуты ] [ extern ] -имяклассаО тело Как видно из определения, деструктор не имеет параметров, не возвращает значения и не требует указания спецификаторов доступа. Его имя совпадает с именем класса и предваряется тильдой (~) , символизирующей обратные по отношению к конструктору действия. Тело деструктора представляет собой блок или просто точку с запятой, если деструктор определен как внешний (extern). Сборщик мусора удаляет объекты, на которые нет ссылок. Он работает в соответствии со своей внутренней стратегией в неизвестные для программиста моменты времени. Поскольку деструктор вызывается сборщиком мусора, невозможно гарантировать, что деструктор будет обязательно вызван в процессе работы программы. Следовательно, его лучше использовать только для гарантии освобождения ресурсов, а штатное освобождение выполнять в другом месте программы. Применение деструкторов замедляет процесс сборки мусора. Вложенные типы В классе можно определять типы данных, внутренние по отношению к классу. Так определяются вспомогательные типы, которые используются только содержащим их классом. Механизм вложенных типов позволяет скрыть ненужные детали Все операции класса должны иметь разные сигнатуры. В отличие от других видов методов, для операций преобразования тип возвращаемого значения включается в сигнатуру, иначе нельзя было бы определять варианты преобразования данного типа в несколько других. Ключевые слова implicit и explicit в сигнатуру не включаются, следовательно, для одного и того же преобразования нельзя определить одновременно явную и неявную версии. Неявное преобразование следует определять так, чтобы при его выполнении не возникала потеря точности и не генерировались исключения. Если эти ситуации возможны, преобразование следует описать как явное.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |