Similar presentations:
Структуры, перечисления
1. Структуры, перечисления
Лекция №112. Структуры
• Структура — тип данных,аналогичный классу, но имеющий
ряд важных отличий от него
3. Отличие структур
• структура является значимым, а не ссылочнымтипом данных;
• структура не может участвовать в иерархиях
наследования, она может только реализовывать
интерфейсы;
• в структуре запрещено определять конструктор
по умолчанию, поскольку он определен неявно и
присваивает всем ее элементам значения по
умолчанию (нули соответствующего типа);
• в структуре запрещено определять деструкторы.
4. Почему структуры, а не классы?
• Иногда прямой доступ к объектам как кзначениям простых типов оказывается
полезно иметь, например, ради
повышения эффективности программы.
Ведь каждый доступ к объектам (даже
самым мелким) по ссылке связан с
дополнительными издержками на
расход вычислительных ресурсов и
оперативной памяти.
5. Синтаксис структуры
• [ атрибуты ] [ спецификаторы ] structимя_структуры [ : интерфейсы ]
{ тело_структуры [ ; ]}
Пример:
• public struct Book {
• public decimal price;
• public string title;
• public string author; }
6. Спецификаторы доступа
• Из спецификаторов доступадопускаются
только public, internal и private (пос
ледний — только для вложенных
структур).
• Почему не protected???
7. Тело структры
• Тело структуры может состоять изконстант, полей, методов, свойств,
событий, индексаторов, операций,
конструкторов и вложенных типов.
8. Особые отличия в объявлении тела структуры
• структуры не могут быть абстрактными (abstract), ктому же по умолчанию они бесплодны (sealed);
• методы структур не могут быть абстрактными и
виртуальными;
• Переопределяться могут только методы,
унаследованные от базового класса object;
• параметр this интерпретируется как значение,
поэтому его можно использовать для ссылок, но не
для присваивания;
• при описании структуры нельзя задавать значения
полей по умолчанию.
9. Пример
• 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 ToString()
{
return ( string.Format( "({0,2:0.##};{1,2:0.##})", re, im
) );
}
10.
Complex a = new Complex( 1.2345, 5.6 );Console.WriteLine( "a = " + a );
Complex b;
b.re = 10; b.im = 1;
Console.WriteLine( "b = " + b );
Complex c = new Complex();
Console.WriteLine( "c = " + c );
c = a + b;
Console.WriteLine( "c = " + c );
11. Стандартные структуры
• Point Пространствоимен: System.Drawing
Сборка: System.Drawing (в
System.Drawing.dll)
• Rectangle Пространство
имен: System.Drawing
Сборка: System.Drawing (в
System.Drawing.dll)
12. Перечисления
• Перечисление (enumeration) — этоопределяемый пользователем
целочисленный тип.
13. Перечисления
• Когда вы объявляете перечисление, тоспецифицируете набор допустимых значений,
которые могут принимать экземпляры
перечислений. Но мало того — этим значениям
еще должны быть присвоены имена, понятные
для пользователей. Если где-то в коде
попытаться присвоить экземпляру
перечисления значение, не входящее в список
допустимых, компилятор выдаст ошибку.
14. Перечисления или простые числа?
• Перечисления облегчают сопровождениекода, гарантируя, что переменным будут
присваиваться только легитимные,
ожидаемые значения.
• Перечисления делают код яснее, позволяя
обращаться к целым значениям, называя их
осмысленными именами.
• Перечисления облегчают ввод исходного кода.
15. Объявление
• enum имя {список_перечисления};Пример:
• enum UI : long { Name, Family, ShortName = 5,
Age, Sex }
• class Program { static void Main() {
• UI user1;
• for (user1 = UI.Name; user1 <= UI.Sex; user1++)
Console.WriteLine("Элемент: \"{0}\", значение
{1}",user1,(int)user1);
• Console.ReadLine(); } }
16. Объявление
17. Перечисления как флаги
• Тип перечисления можно использоватьдля определения битовых флагов,
благодаря чему экземпляр типа
перечисления может хранить любую
комбинацию значений, определенных в
списке перечислителя. (Конечно,
некоторые комбинации могут не иметь
смысла или могут быть недопустимы в
коде программы).
18. Перечисления как флаги
[Flags]enum Days{
None = 0x0,
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40}
19. Перечисления как флаги
Чтобы установить флаг на перечислении, используйте
побитовый оператор OR, как показано в следующем примере.
//инициализируется при помощи или
meetingDays = Days2.Tuesday | Days2.Thursday;
// Добавить в существующее можно тоже при помощи или
meetingDays = meetingDays | Days2.Friday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// на выходе Tuesday, Thursday, Friday
// вычеркнуть можно при помощи XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// на выходе Thursday, Friday
20. Перечисления как флаги
• // Проверить входит ли в флаг в перечислениеAND.
• bool test = (meetingDays & Days2.Thursday) ==
Days2.Thursday;
• Console.WriteLine("Thursday {0} a meeting day.",
test == true ? "is" : "is not");
• // На выходеThursday is a meeting day.
21. Использование методов System.Enum для получения и обработки значений перечислений
• string s = Enum.GetName(typeof(Days), 4);• Console.WriteLine(s);
• Console.WriteLine("The values of the Days Enum are:");
• foreach (int i in Enum.GetValues(typeof(Days)))
Console.WriteLine(i);
• Console.WriteLine("The names of the Days Enum are:");
• foreach (string str in Enum.GetNames(typeof(Days)))
Console.WriteLine(str);