Программирование >>  Обработка исключительных ситуаций 

1 ... 54 55 56 [ 57 ] 58 59 60 ... 142


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 в сигнатуру не включаются, следовательно, для одного и того же преобразования нельзя определить одновременно явную и неявную версии.

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



1 ... 54 55 56 [ 57 ] 58 59 60 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика