Структуры, перечисления
Структуры
Отличие структур
Почему структуры, а не классы?
Синтаксис структуры
Спецификаторы доступа
Тело структры
Особые отличия в объявлении тела структуры
Пример
Стандартные структуры
Перечисления
Перечисления
Перечисления или простые числа?
Объявление
Объявление
Перечисления как флаги
Перечисления как флаги
Перечисления как флаги
Перечисления как флаги
Использование методов System.Enum для получения и обработки значений перечислений
234.99K
Категория: ПрограммированиеПрограммирование

Структуры, перечисления

1. Структуры, перечисления

Лекция №11

2. Структуры

• Структура — тип данных,
аналогичный классу, но имеющий
ряд важных отличий от него

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);
English     Русский Правила