|
Программирование >> Обработка исключительных ситуаций
Результат работы программы: а = (1.23:5,6) b = (10; 1) с = ( 0; 0) с = (11,23:6.6) При выводе экземпляра структуры на консоль выполняется упаковка, то есть неявное преобразование в ссылочный тип. Упаковка (это понятие было введено в разделе Упаковка и распаковка , см. с. 36) применяется и в других случаях, когда структурный тип используется там, где ожидается ссылочный, например, при преобразовании экземпляра структуры к типу реализуемого ею интерфейса. При обратном преобразовании - из ссылочного типа в структурный - выполняется распаковка. Присваивание структур имеет, что естественно, значимую семантику, то есть при присваивании создается копия значений полей. То же самое происходит и при передаче структур в качестве параметров по значению. Для экономии ресурсов ничто не мешает передавать структуры в методы по ссылке с помощью ключевых слов ref или out. Особенно значительный выигрыш в эффективности можно получить, используя массивы структур вместо массивов классов. Например, для массива из 100 экземпляров класса создается 101 объект, а для массива структур - один объект. Пример работы с массивом структур, описанных в предыдущем листинге: Complex [] mas = new Complex[4]; for ( int i = 0; i < 4; ++i ) mas[i].re = i; mas[i].im = 2 * i; foreach ( Complex elem in mas ) Console.WriteLine( elem ); Листинг 9.8 (продолжение) Console.WriteLineC а = + а ); Complex b: b.re = 10; b.im = 1; Console.WriteLineC b = + b ); Complex с = new ComplexO; Console.WriteLineC c = + с ); с = a + b; Console.WriteLineC c = + с ); Перечисления При написании программ часто возникает потребность определить несколько связанных между собой именованных констант, при этом их конкретные значения могут быть не важны. Для этого удобно воспользоваться перечисляемым типом данных, все возможные значения которого задаются списком целочисленных констант, например: enum Menu { Read, Write, Append, Exit } enum Радуга { Красный, Оранжевый, Желтый, Зеленый, Синий, Фиолетовый } Для каждой константы задается ее символическое имя. По умолчанию константам присваиваются последовательные значения типа i nt, начиная с 0, но можно задать и собственные значения, например: enum Nums { two = 2, three, four, ten = 10, eleven, fifty = ten + 40 }: Константам three и four присваиваются значения 3 и 4, константе eleven - 11. Имена перечисляемых констант внутри каждого перечисления должны быть уникальными, а значения могут совпадать. Преимущество перечисления перед описанием именованных констант состоит в том, что связанные константы нагляднее; кроме того, компилятор выполняет проверку типов, а интегрированная среда разработки подсказывает возможные значения констант, выводя их список. Синтаксис перечисления: [ атрибуты ] [ спецификаторы ] enum имя перечисления [ : базовыйтип ] тело перечисления [ ; ] Спецификаторы перечисления имеют такой же смысл, как и для класса, причем допускаются только спецификаторы new, public, protected, internal и private. Базовый тип - это тип элементов, из которых построено перечисление. По умолчанию используется тип int, но можно задать тип и явным образом, выбрав его среди целочисленных типов (кроме char), а именно: byte, sbyte, short, ushort, int, uint, long и ulong. Необходимость в этом возникает, когда значения констант невозможно или неудобно представлять с помощью типа i nt. Тело перечисления состоит из имен констант, каждой из которых может быть присвоено значение. Если значение не указано, оно вычисляется прибавлением единицы к значению предыдущей константы. Константы по умолчанию имеют спецификатор доступа public. Если поместить этот фрагмент вместо тела метода Main в листинге 9.5, получим следующий результат: ( 0 0) ( 1 2) ( 2 4) ( 3 6) Console.WriteLineC х.Звание + + х.Фамилия ); Результат работы программы: Сержант Иванов Перечисления удобно использовать для представления битовых флагов, например: enum Flags ; byte ЬО, Ы. Ь2, ЬЗ = 0x04, Ь4 = 0x08, Ь5 = 0x10, Ь6 = 0x20, Ь7 = 0x40 Операции с перечислениями С переменными перечисляемого типа можно выполнять арифметические операции ( + , - , + + , --) , логические поразрядные операции (*, &, , ~) , сравнивать их с помощью операций отношения (<, < = , >, >=, ==, ! = ) и получать размер в байтах (sizeof). При использовании переменных перечисляемого типа в целочисленных выражениях и операциях присваивания требуется явное преобразование типа. Переменной перечисляемого типа можно присвоить любое значение, представимое с помощью Перечисления часто используются как вложенные типы, идентифицируя значения из какого-либо ограниченного набора. Пример такого перечисления приведен в листинге 9.9. Листинг 9.9. Пример перечисления using System; namespace ConsoleApplicationl { struct Боец public enum ВоинскоеЗвание Рядовой, Сержант, Майор, Генерал public string Фамилия; public ВоинскоеЗвание Звание; class Classl { static void MainO Боец x; х.Фамилия = Иванов ; x.Звание = Боец.ВоинскоеЗвание.Сержант;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |