Структуры
Как вам должно быть уже известно, классы относятся к ссылочным типам данных. Это означает, что объекты конкретного класса доступны по ссылке, в отличие от значений простых типов, доступных непосредственно. Но иногда прямой доступ к рбъектам как к значениям простых типов оказывается полезно иметь, например, ради повышения эффективности программы. Ведь каждый доступ к объектам (даже самым мелким) по ссылке связан с дополнительными издержками на расход вычислительных ресурсов и оперативной памяти. Для разрешения подобных затруднений в C# предусмотрена структура, которая подобна классу, но относится к типу значения, а не к ссылочному типу данных.
Структуры объявляются с помощью ключевого слова struct и с точки зрения синтаксиса подобны классам. Ниже приведена общая форма объявления структуры:
struct имя : интерфейсы {
II объявления членов
}
где имя обозначает конкретное имя структуры.
Одни структуры не могут наследовать другие структуры и классы или служить в качестве базовых для других структур и классов. (Разумеется, структуры, как и все остальные типы данных в С#, наследуют класс obj ect.) Тем не менее в структуре можно реализовать один или несколько интерфейсов, которые указываются после имени структуры списком через запятую. Как и у классов, у каждой структуры имеются свои члены: методы, поля, индексаторы, свойства, операторные методы и события. В структурах допускается также определять конструкторы, но не деструкторы. В то же время для структуры нельзя определить конструктор, используемый по умолчанию (т.е. конструктор без параметров). Дело в том, что конструктор, вызываемый по умолчанию, определяется для всех структур автоматически и не подлежит изменению. Такой конструктор инициализирует поля структуры значениями, задаваемыми по умолчанию. А поскольку структуры не поддерживают наследование, то их члены нельзя указывать как abstract, virtual или protected.
Объект структуры может быть создан с помощью оператора new таким же образом, как и объект класса, но в этом нет особой необходимости. Ведь когда используется оператор new, то вызывается конструктор, используемый по умолчанию. А когда этот оператор не используется, объект по-прежнему создается, хотя и не инициализируется. В этом случае инициализацию любых членов структуры придется выполнить вручную.
В приведенном ниже примере программы демонстрируется применение структуры для хранения информации о книге.
// Продемонстрировать применение структуры.
using System;
// Определить структуру, struct Book {
public string Author; public string Title; public int Copyright;
public Book(string a, string t, int c) {
Author = a;
Title = t;
Copyright = c;
}
}
// Продемонстрировать применение структуры Book, class StructDemo { static void Main() {
Book bookl = new Book("Герберт Шилдт",
"Полный справочник ho C# 4.0",
2010); // вызов явно заданного конструктора Book book2 = new Book(); // вызов конструктора по умолчанию Book ЬоокЗ; // конструктор не вызывается
Console.WriteLine(bookl.Author + ", " +
bookl.Title + ", (c) " + bookl.Copyright);
Console.WriteLine();
if (book2.Title == null)
Console.WriteLine("Член book2.Title пуст.");
// А теперь ввести информацию в структуру book2. book2.Title = "О дивный новый мир"; book2.Author = "Олдос Хаксли"; book2.Copyright = 1932;
Console.Write("Структура book2 теперь содержит:\n");
Console.WriteLine(book2.Author + ", " +
book2.Title + ", (c) " + book2.Copyright);
Console.WriteLine() ;
// Console.WriteLine(ЬоокЗ.Title); // неверно, этот член структуры
// нужно сначала инициализировать
ЬоокЗ.Title = "Красный шторм";
Console.WriteLine(ЬоокЗ.Title); // теперь верно
}
}
При выполнении этой программы получается следующий результат.