Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч
Download 2.46 Mb.
|
Язык программирования C#
11. СТРУКТУРЫ И ПЕРЕЧИСЛЕНИЯ
11.1. Понятие структуры Структуры являются средством группирования данных и методов их обработки в одно целое. В этом структуры аналогичны классам, и в принципе и без них можно легко обходиться, но использование структур делает код более понятным и наглядным. Но самое главное, обращение к структурам происходит намного эффективнее обращения к классам. Это связано с тем, что экземпляры структур в отличие от объектов классов размещаются в стеке, а не в управляемой куче. В основном структуры применяются только для логической связи разрозненных данных в одно целое. Поэтому типичная структура состоит из нескольких открытых полей и конструктора для их инициализации. Структуры в отличие от классов не могут выступать родителями в отношения наследования. Но сами структуры могут наследовать от классов и реализовывать интерфейсы. Следовательно, структуры можно считать некоторым аналогом конечных sealed классов. 11.2. Определение и создание структур Для определения структур используется практически тот же синтаксис, что и для определения классов, все различие между определениями заключается в том, что ключевое слово class меняется на struct. Приведем схему, показывающую общий формат использования структур. struct имя_структуры { // определение членов } Спецификаторы перед определением самой структуры или её членов используются те же, что и для классов за исключением того, что спецификаторы, необходимые для наследования (sealed, virtual, abstract) не применяются, т.к. структуры не могут выступать в качестве родителей при наследовании. Приведем пример простейшей структуры, состоящий лишь из нескольких сгруппированных вместе полей. public struct Book { public decimal Price; public string Title; public string Author; } Лист. 2.1 Эта структура содержит определение всех необходимых полей для хранения информации о книге. Объявление экземпляра структуры аналогично объявлению экземпляра класса и имеет следующий общий формат. имя_структуры имя_переменной; В нашем случае для объявления и создания экземпляра структуры достаточно написать следующую строчку кода. Book aBook; Лист. 2.2 Структура – это стековый тип, поэтому доступ к полям объекта некоторой структуры возможен сразу после его объявления, т.е. явный вызов конструктора структуры не требуются и все поля объекта структуры будут автоматически инициализированы значениями по умолчанию. Но до вызова пустого конструктора поля объекта все равно не могут использоваться справа от знака присваивания. Book aBook = new Book(); Лист. 2.3 Доступ к членам структуры осуществляется также как и доступ к членам класса, с использованием оператора уточнения точки. Вообще в языке C# все уточнения делаются с использованием одного единственного оператора точки “.”. aBook.price = 30; aBook.title = "Основы С#"; aBook.author = "Азиз Ходжаев"; Лист. 2.4 В этом листинге полям объекта aBook присваиваются некоторые значения, к которым в дальнейшем можно будет обратиться. Console.WriteLine(aBook.price); Console.WriteLine(aBook.title); Console.WriteLine(aBook.author); Лист. 2.5 Объединим все приведенные выше разрозненные примеры в одно целое. Это позволит лучше рассмотреть предмет в перспективе. public struct Book { public decimal price; public string title; public string author; } class Program { static void Main(string[] args) { Book aBook; aBook.price = 30; aBook.title = "Основы С#"; aBook.author = "Азиз Ходжаев"; Console.WriteLine(aBook.price); Console.WriteLine(aBook.title); Console.WriteLine(aBook.author); } } Лист. 2.6 Вывод программы: 30
Азиз Ходжаев Вывод. 2.1 Аналогично классам структуры могут содержать в себе определения конструктов, методов свойств и индексаторов. Однако у конструкторов структур есть две важные особенности: 1. Конструктор структуры должен инициализировать все её поля. 2. В структуре нельзя создать конструктор без параметров. struct Square { double X1, Y1; // левый верхний угол double X2, Y2; // правый нижний угол public Square(double X1, double Y1, double X2, double Y2) { this.X1 = X1; this.Y1 = Y1; this.X2 = X2; this.Y2 = Y2; } public double Rib { get { if (X1 > X2) return (X1 - X2); else return (X2 - X1); } } public double GetDaigonalLength() { return Math.Sqrt((X2 - X1) * (X2 - X1) + (Y2 - Y1) * (Y2 - Y1)); } } Лист. 2.7 На листинге приведена структура, инкапсулирующая представление квадрата на прямоугольной системе координат. Создадим теперь класс для тестирования созданной нами структуры. class Program { static void Main(string[] args) { Console.WriteLine("NullSquare"); Console.WriteLine(NullSquare.Rib); Console.WriteLine(NullSquare.GetDaigonalLength()); Console.WriteLine("aSquqre"); Console.WriteLine(aSquqre.Rib); Console.WriteLine(aSquqre.GetDaigonalLength()); } } Лист. 2.8 В этом листинге создаются два экземпляра структуры Square: NullSquare и aSquqre. Затем производится обращение к методам и свойствам обеих структур. По результатам вывода этой программы видно, что пустой конструктор проинициализировал все поля объекта NullSquare значениями по умолчанию. Вывод программы: NullSquare 0 0 aSquqre 2 2,82842712474619 Лист. 2.9 Download 2.46 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling