
Ответы по Технологии программирования / Структуры_ описание и назначение
.docxКлассы — это ссылочные типы. Это означает, что к объектамклассов доступ осуществляется через ссылку. Этим они отличаются от типов значений, к которым в С# реализован прямой доступ. Но иногда желательно получатьпрямой доступ и к объектам, как в случае нессылочных типов. Одна из причин дляэтого — эффективность. Ведь очевидно, что доступ к объектам классов через ссылкиувеличивает расходы системных ресурсов, в том числе и памяти. Даже для очень маленьких объектов требуются существенные объемы памяти. Для компенсации упомянутых расходов времени и пространства в С# предусмотрены структуры. Структура подобна классу, но она относится к типу значений, а не к ссылочным типам.
Структуры объявляются с использованием ключевого слова struct и синтаксически подобны классам. Формат записи структуры таков:
struct имя : интерфейсы {
// объявления членов
}
Элемент имя означает имя структуры.
Структуры не могут наследовать другие структуры или классы. Структуры не могут использоваться в качестве базовых для других структур или классов. (Однако, подобно другим С#-типам, структуры наследуют класс object). Структура может реализовать один или несколько интерфейсов. Они указываются после имени структуры и отделяются запятыми. Как и у классов, членами структур могут быть методы, поля, индексаторы, свойства, операторные методы и события. Структуры могут также определять конструкторы, но не деструкторы. Однако для структуры нельзя определить конструктор по умолчанию (без параметров). Дело в том, что конструктор по умолчанию автоматически определяется для всех структур, и его изменить нельзя. Поскольку структуры не поддерживают наследования, члены структуры нельзя определять с использованием модификаторов 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,
classStructDemo {
public static void Main() {
Book book1 = new Book("Herb Schildt","C# A Beginner's Guide",2001); // Вызов явно заданного конструктора.
Bookbook2 = newBook(); // Вызов конструктора
// по умолчанию.
BookbоокЗ; // Создание объекта без вызова
// конструктора.
Console.WriteLine(book1.title + ", автор " +book1.author +
“, (с) " + book1. copyright );
Console.WriteLine();
if(book2.title == null)
Console.WriteLine("Член book2.title содержит null.");
// Теперь поместим в структуру book2 данные.
book2.title = "Brave New World";
book2.author = "Aldous Huxley";
book2.copyright = 1932;
Console.Write("Теперь структура book2 содержит:\n" ) ;
Console.WriteLine(book2.title + ", автор " +book2.author +
", (c) " + book2.copyright);
Console.WriteLine();
// Console.WriteLine(bоокЗ.title); // Ошибка: сначала
// необходима
// инициализация.
bоокЗ.title = "Red Storm Rising";
Console.WriteLine(bоокЗ.title); // Теперь все Ok!
}}
Вот результаты выполнения этой программы:
С# A Beginner's Guide, автор Herb Schildt, (с) 2001
Структура может быть создана либо с помощью оператора new, который вызывает соответствующий конструктор, либо простым объявлением объекта. При использовании оператора new поля структуры будут инициализированы, причем это сделает либо конструктор по умолчанию (он инициализирует все поля значениями по умолчанию), либо конструктор, определенный пользователем. Если оператор new не используется, как в случае объекта bоокЗ, созданный таким образом объект остается неинициализированным, и его поля должны быть установлены до начала использования.
При присваивании одной структуры другой создается копия этого объекта. Это — очень важное отличие struct-объекта от сlass-объекта. Как упоминалось выше, присваивая одной ссылке на класс другую, вы просто меняете объект, на который ссылается переменная, стоящая с левой стороны от оператора присваивания. А присваивая одной struct-переменной другую, вы создаете копию объекта, указанного с правой стороны от оператора присваивания.
Поскольку структуры — это типы значений, они обрабатываются напрямую, а не через ссылки. Таким образом, тип struct не требует отдельной ссылочной переменной. Это означает, что при использовании структур расходуется меньший объем памяти. Более того, благодаря прямому доступу к структурам, при работе с ними не снижается производительность, что имеет место при доступе к объектам классов. Поскольку классы — ссылочные типы, доступ к их объектам осуществляется через ссылки. Такая косвенность увеличивает затраты системных ресурсов при каждом доступе. Структуры этим не страдают. В общем случае, если вам нужно хранить небольшую группу связанных данных, но не нужно обеспечивать наследование и использовать другие достоинства ссылочных типов, тип struct может оказаться более предпочтительным вариантом.