Структуры C#
Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье мы поговорили про перечисления в C#. В данной статье я бы хотел поговорить про структуры в C#. Для тех, кто программировал на "Turbo Pascal", структуры — это записи (record). Структура состоит из множества переменных, которые упакованы внутри структуры. Это — поля структуры. Эти поля могут иметь разные типы, но все вместе они образуют единое значение, которое называется значением этой структуры. Кроме полей в структуре могут быть методы и события. Она по сути является классом. Различие заключается в том, что класс — это ссылочный тип (ReferenceType). Переменная типа "Класс" — является ссылкой, т.е. указывает на объект, а объект хранится в динамической области памяти (куча). Структура — это "ValueType". Переменная типа "Структура" хранится в стеке.
Давайте на примерах разберем, как определяется этот тип данных и как с ним работать.
struct Room { public double widthRoom; public double lengthRoom; public int numberOfWindows; }
В данном примере мы создали структуру "Room" с 3 полями: ширина комнаты, её высота и количество окон. Поработаем с нашей комнатой:
Room myRoom; myRoom.widthRoom = 5; myRoom.lengthRoom = 4; myRoom.numberOfWindows = 2; Console.WriteLine("Наша комната: ширина {0}, высота {1}, количество окон {2}", myRoom.widthRoom, myRoom.lengthRoom, myRoom.numberOfWindows); Console.ReadLine();
Убедимся в том, что "Структура" действительно является "ValueType". Создадим ещё одну комнату myRoom2 и скопируем ей значение myRoom. При этом произойдёт полное копирование полей. Изменим у второй комнаты количество окон на 1. Что при этом произойдёт с количеством окон первой комнаты? Останется также 2 окна. Это ещё раз говорит нам о том, что структура копируется по значению, а не по ссылке (в отличие от объектов):
Room myRoom2 = myRoom; myRoom2.numberOfWindows = 1; Console.WriteLine("Наша 2 комната: ширина {0}, высота {1}, количество окон {2}", myRoom2.widthRoom, myRoom2.lengthRoom, myRoom2.numberOfWindows); Console.WriteLine("Наша 1 комната: ширина {0}, высота {1}, количество окон {2}", myRoom.widthRoom, myRoom.lengthRoom, myRoom.numberOfWindows);
Теперь создадим в структуре метод, который выводит информацию о комнате:
struct Room { public double widthRoom; public double lengthRoom; public int numberOfWindows; public void showInfoAboutRoom() { Console.WriteLine("Наша комната: ширина {0}, высота {1}, количество окон {2}", widthRoom, lengthRoom, numberOfWindows); } } myRoom.showInfoAboutRoom();
Для информации скажу, что в структуре можно описать конструктор. Если этого не сделать, то будет создан конструктор по умолчанию. Можно также задать свойства (property). Свойства реализовываются точно также, как и в случае с классами. Отличие конструктора структуры от конструктора класса заключается в том, что в конструкторе структуры мы должны проинициализировать все поля. Переделаем нашу комнату:
Свойства:
public double WidthRoom {get; set;} public double LengthRoom { get; set; } public int NumberOfWindows { get; set; }
Конструктор:
public Room(double WRoom, double LRoom, int NWindows) { this.widthRoom = WRoom; this.lengthRoom = LRoom; this.numberOfWindows = NWindows; }
Если мы описали свой собственный конструктор, то в случае со структурами останется и конструктор по умолчанию. В случае с классами его, как мы знаем, не будет.
В данной статье вы узнали, как работать со структурами в C#
На связи был Алексей Гулынин, увидимся в следующих статьях.