Структуры, перечисления.pptx
- Количество слайдов: 21
Структуры, перечисления Лекция № 11
Структуры • Структура — тип данных, аналогичный классу, но имеющий ряд важных отличий от него
Отличие структур • структура является значимым, а не ссылочным типом данных; • структура не может участвовать в иерархиях наследования, она может только реализовывать интерфейсы; • в структуре запрещено определять конструктор по умолчанию, поскольку он определен неявно и присваивает всем ее элементам значения по умолчанию (нули соответствующего типа); • в структуре запрещено определять деструкторы.
Почему структуры, а не классы? • Иногда прямой доступ к объектам как к значениям простых типов оказывается полезно иметь, например, ради повышения эффективности программы. Ведь каждый доступ к объектам (даже самым мелким) по ссылке связан с дополнительными издержками на расход вычислительных ресурсов и оперативной памяти.
Синтаксис структуры • [ атрибуты ] [ спецификаторы ] struct имя_структуры [ : интерфейсы ] { тело_структуры [ ; ]} Пример: • public struct Book { • public decimal price; • public string title; • public string author; }
Спецификаторы доступа • Из спецификаторов доступа допускаются только public, internal и private (пос ледний — только для вложенных структур). • Почему не protected? ? ?
Тело структры • Тело структуры может состоять из констант, полей, методов, свойств, событий, индексаторов, операций, конструкторов и вложенных типов.
Особые отличия в объявлении тела структуры • структуры не могут быть абстрактными (abstract), к тому же по умолчанию они бесплодны (sealed); • методы структур не могут быть абстрактными и виртуальными; • Переопределяться могут только методы, унаследованные от базового класса object; • параметр this интерпретируется как значение, поэтому его можно использовать для ссылок, но не для присваивания; • при описании структуры нельзя задавать значения полей по умолчанию.
Пример • struct Complex • { public double re, im; public Complex( double re_, double im_ ) • { re = re_; im = im_; // можно использовать this. re, this. im } • public static Complex operator + ( Complex a, Complex b ) { • return new Complex( a. re + b. re, a. im + b. im ); } • public override string To. String() • { • return ( string. Format( "({0, 2: 0. ##}; {1, 2: 0. ##})", re, im ) ); • }
Complex a = new Complex( 1. 2345, 5. 6 ); Console. Write. Line( "a = " + a ); Complex b; b. re = 10; b. im = 1; Console. Write. Line( "b = " + b ); Complex c = new Complex(); Console. Write. Line( "c = " + c ); c = a + b; Console. Write. Line( "c = " + c );
Стандартные структуры • Point Пространство имен: System. Drawing Сборка: System. Drawing (в System. Drawing. dll) • Rectangle Пространство имен: System. Drawing Сборка: System. Drawing (в System. Drawing. dll)
Перечисления • Перечисление (enumeration) — это определяемый пользователем целочисленный тип.
Перечисления • Когда вы объявляете перечисление, то специфицируете набор допустимых значений, которые могут принимать экземпляры перечислений. Но мало того — этим значениям еще должны быть присвоены имена, понятные для пользователей. Если где-то в коде попытаться присвоить экземпляру перечисления значение, не входящее в список допустимых, компилятор выдаст ошибку.
Перечисления или простые числа? • Перечисления облегчают сопровождение кода, гарантируя, что переменным будут присваиваться только легитимные, ожидаемые значения. • Перечисления делают код яснее, позволяя обращаться к целым значениям, называя их осмысленными именами. • Перечисления облегчают ввод исходного кода.
Объявление • enum имя {список_перечисления}; Пример: • enum UI : long { Name, Family, Short. Name = 5, Age, Sex } • class Program { static void Main() { • UI user 1; • for (user 1 = UI. Name; user 1 <= UI. Sex; user 1++) Console. Write. Line("Элемент: "{0}", значение {1}", user 1, (int)user 1); • Console. Read. Line(); } }
Объявление
Перечисления как флаги • Тип перечисления можно использовать для определения битовых флагов, благодаря чему экземпляр типа перечисления может хранить любую комбинацию значений, определенных в списке перечислителя. (Конечно, некоторые комбинации могут не иметь смысла или могут быть недопустимы в коде программы).
Перечисления как флаги • • • [Flags]enum Days{ None = 0 x 0, Sunday = 0 x 1, Monday = 0 x 2, Tuesday = 0 x 4, Wednesday = 0 x 8, Thursday = 0 x 10, Friday = 0 x 20, Saturday = 0 x 40}
Перечисления как флаги • • • Чтобы установить флаг на перечислении, используйте побитовый оператор OR, как показано в следующем примере. //инициализируется при помощи или meeting. Days = Days 2. Tuesday | Days 2. Thursday; // Добавить в существующее можно тоже при помощи или meeting. Days = meeting. Days | Days 2. Friday; Console. Write. Line("Meeting days are {0}", meeting. Days); // на выходе Tuesday, Thursday, Friday // вычеркнуть можно при помощи XOR. meeting. Days = meeting. Days ^ Days 2. Tuesday; Console. Write. Line("Meeting days are {0}", meeting. Days); // на выходе Thursday, Friday
Перечисления как флаги • // Проверить входит ли в флаг в перечисление AND. • bool test = (meeting. Days & Days 2. Thursday) == Days 2. Thursday; • Console. Write. Line("Thursday {0} a meeting day. ", test == true ? "is" : "is not"); • // На выходе. Thursday is a meeting day.
Использование методов System. Enum для получения и обработки значений перечислений • string s = Enum. Get. Name(typeof(Days), 4); • Console. Write. Line(s); • Console. Write. Line("The values of the Days Enum are: "); • foreach (int i in Enum. Get. Values(typeof(Days))) Console. Write. Line(i); • Console. Write. Line("The names of the Days Enum are: "); • foreach (string str in Enum. Get. Names(typeof(Days))) Console. Write. Line(str);


