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

1 ... 68 69 70 [ 71 ] 72 73 74 ... 142


оазового типа, то есть не только одно из значении, входящих в тело перечисления. Присваиваемое значение становится новым элементом перечисления.

Пример:

Flags а = Flags.b2 Flags.b4; Console.WriteLineC а = {0} {0,2:Х} , а );

++а;

Console.WriteLineC а = {0} {0.2:X} . а ): int х = (int) а;

Console.WriteLine( x = {0} {0.2:X} , x ); Flags b = (Flags) 65;

Console.WriteLine( b = {0} {0.2:X} , b );

Результат работы этого фрагмента программы ({0,2:Х} обозначает шестнадцате-ричный формат вывода):

Другой пример использования операций с перечислениями приведен в листинге 9.10.

Листинг 9.10. Операции с перечислениями using System;

namespace ConsoleApplicationi {

struct Боец

public enum ВоинскоеЗвание

Рядовой, Сержант, Лейтенант, Майор, Полковник, Генерал

public string Фамилия;

public ВоинскоеЗвание Звание;

class Classl

{ static void MainO

Боец x;

x.Фамилия = Иваново

x.Звание = Боец.ВоинскоеЗвание.Сержант; for ( int i = 1976; i < 2006; i += 5 )

if ( x.Звание < Боец.ВоинскоеЗвание.Генерал ) ++х.Звание;



Результат работы программы:

Год 1976 Лейтенант Иванов

Год 1981 Майор Иванов

Год 1986 Полковник Иванов

Год 1991 Генерал Иванов

Год 1996 Генерал Иванов

Год 2001 Генерал Иванов

Базовый класс System.Enum

Все перечисления в С# являются потомками базового класса System.Enum, который снабжает их некоторыми полезными методами.

Статический метод GetName позволяет получить символическое имя константы по ее номеру, например:

Console.WriteLineC Enum.GetName(typeof( Flags ). 8) ); fc>4

Console.WriteLineC Enum.GetNameCtypeof( Боец.ВоинскоеЗвание ),!)): Сержант

ПРИМЕЧАНИЕ-

Операция typeof возвращает тип своего аргумента (см. раздел Рефлексия в главе 12).

Статические методы GetNames и GetValues формируют, соответственно, массивы имен и значений констант, составляющих перечисление, например:

Array names = Enum.GetNames( typeof(Flags) );

Console.WriteLineC Количество элементов в перечислении: + names.Length ); foreach ( string elem in names ) Console.WriteC + elem );

Array values = Enum.GetValuesC typeof(Flags) );

foreach ( Flags elem in values ) Console.WriteC + (byte) elem );

Статический метод IsDefined возвращает значение true, если константа с заданным символическим именем описана в указанном перечислении, и false в противном случае, например:

if ( Enum.IsDefinedC typeof( Flags ), Ь5 ) )

Console.WriteLine( Константа с именем Ь5 существует ); else Console.WriteLine( Константа с именем Ь5 не существует );

Статический метод GetUnderlyingType возвращает имя базового типа, на котором построено перечисление. Например, для перечисления Flags будет получено System.Byte:

Console.WriteLine( Enum.GetUnderlyingType( typeof(Flags) ) );

Листинг 9.10 (продолжение)

Console.WriteLineC Год: {0} {1} {2} .

1 . х.Звание. х.Фамилия



Рекомендации по программированию 219

Рекомендации по программированию

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

Если некий набор действий имеет смысл только для какой-то конкретной иерархии классов, реализующих эти действия разными способами, уместнее задать этот набор в виде виртуальных методов абстрактного базового класса иерархии.

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

В библиотеке .NET определено большое количество стандартных интерфейсов. Реализация стандартных интерфейсов в собственных классах позволяет использовать для объектов этих классов стандартные средства языка и библиотеки.

Например, для обеспечения возможности сортировки объектов стандартными методами следует реализовать в соответствующем классе интерфейсы IComparable или IComparer. Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать содержимое объекта с помощью конструкции foreach, а реализация интерфейса ICloneable - клонировать объекты.

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

Область применения структур - типы данных, имеющие небольшое количество полей, с которыми удобнее работать как со значениями, а не как со ссылками. Накладные расходы на динамическое выделение памяти для экземплятров небольших классов могут весьма значительно снизить быстродействие программы, поэтому их эффективнее описывать как структуры.

Преимущество использования перечислений для описания связанных между собой значений состоит в том, что это более наглядно и инкапсулировано, чем россыпь именованных констант. Кроме того, компилятор выполняет проверку типов, а интегрированная среда разработки подсказывает возможные значения констант, выводя их список.



1 ... 68 69 70 [ 71 ] 72 73 74 ... 142

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