Структуры. Общие понятия. Тип структуры. Структурная переменная. Модификаторы доступа к структурной переменной. Примеры использования структур в разных частях программы

Структуры. Общие понятия. Тип структуры. Структурная переменная. Модификаторы доступа к структурной переменной. Примеры использования структур в разных частях программы


Содержание


1. Что такое структура в языке C#? Назначение структур

Часто, при написании программ, которые содержат разнообразные данные, возникает необходимость группирования этих данных по некоторому критерию. Такое группирование есть необходимым для улучшения наглядности программного кода, который в свою очередь приводит к уменьшению ошибок и повышения производительности работы программиста.

Доступ к сгруппированным данным упрощает использование имен в программе. Данные группируются соответственно проблемной области, для которой разрабатывается программа.

В языке программирования C#, с целью удобного группирования данных, используются так называемые структуры.

Использование структуры в программе происходит в 2 этапа:

  • объявление типа структуры;
  • объявление структурной переменной.

 

2. Какая общая форма объявления структуры (структурного типа)? Ключевое слово struct

Общая форма объявления типа структуры:

struct имя_типа_структуры : интерфейсы
{
    // объявление членов и методов структуры
    // ...
}

где

  • имя_типа_структуры – название структурного типа на основе которого будут объявляться объекты (переменные, экземпляры структуры);
  • интерфейсы – список интерфейсов, методы которых нужно реализовать в теле структуры.

 

3. Пример объявления структуры, которая описывает информацию о студенте

Пусть нужно сформировать базу данных студентов учебного заведения. Данные о студентах в базе данных можно представить структурами. В простейшем случае каждая структура должна объединять следующие данные:

  • фамилия студента;
  • имя студента;
  • год вступления в учебное заведение;
  • год рождения;
  • адрес проживания;
  • номер зачетной книжки;
  • текущий рейтинг студента.

Структура, которая описывает эту информацию будет иметь приблизительно такой вид:

struct Student
{
    public string name; // фамилия
    public string surname; // имя
    public int year; // год вступления в учебное заведение
    public int birth_year; // год рождения
    public string address; // адрес проживания
    public string book_number; // номер зачетной книжки
    public float rank; // рейтинг
}

 

4. Что такое структурная переменная? Как выделяется память для структурной переменной? Пример объявления, инициализации и использования структурной переменной

Пусть дано объявление структурной переменной, описывающей одну запись в телефонном справочнике:

struct Telephone
{
    public string number; // номер телефона
    public string name; // имя абонента
    public string surname; // фамилия абонента
    public string address; // адрес
    public int code; // почтовый код
}

Объявление и использование структурной переменной типа Telephone будет следующим:

// Объявление структурной переменной с именем T1 типа Telephone
Telephone T1;

// заполнение полей структурной переменной T1
T1.name = "Johnson";
T1.surname = "John";
T1.number = "77777777";
T1.code = 89300;
T1.address = "Boston";

 

5. Какой тип доступа по умолчанию имеют поля структурной переменной? Примеры

По умолчанию, поля структурной переменной имеют тип доступа private. Чтобы можно было иметь доступ к полям структурной переменной непосредственно, используется ключевое слово public.

Пример 1. Пусть дано объявление структуры, которая описывает информацию о студенте:

struct Student
{
    string name; // фамилия
    string surname; // имя
    int year; // год вступления в учебное заведение
    int birth_year; // год рождения
    string address; // адрес проживания
    string book_number; // номер зачетной книжки
    float rank; // рейтинг
}

В данной структуре все члены не имеют явным образом заданного модификатора доступа (private, public). По умолчанию, устанавливается модификатор доступа private. Это означает, что при объявлении переменной типа Student, невозможно будет доступиться к полям структуры непосредственно. То есть следующий программный код будет ошибочным:

Student St;
St.name = "Name of student"; // ошибка!
St.year = 1990; // ошибка!

Пример 2. Пусть дано объявление типа структуры, содержащей информацию о дате (число, месяц, год):

struct Date
{
    public int day; // число
    public int month; // месяц
    public int year; // год
}

Тогда, использование структуры в некотором методе может быть следующим:

// использование структурной переменной в коде некоторого метода
Date D; // объявление переменной с именем D типа "структура Date"

// заполнение полей структурной переменной
// поля объявлены как public
D.day = 14;
D.month = 1;
D.year = 1972;

 

6. В каких частях программного кода можно объявлять структуру и структурную переменную для Windows Forms приложений?

Для приложений, созданных по шаблону Windows Forms Application, тип структуры можно объявлять:

  • в пределах пространства имен но за пределами класса;
  • в пределах класса но за пределами методов класса.

В методе класса объявить тип структуры не удастся.
Структурную переменную можно объявлять в классе как в методах класса, так и за пределами методов класса.



 

7. Какое отличие между структурой и классом с точки зрения их представления в памяти?

Структуры относятся к значимым типам (value type). Это значит, что они неявно унаследованы от класса System.ValueType. К типам-значениям (структурным типам) относятся базовые (примитивные) типы данных, такие как short, int, uint, double, float, bool и другие, а также их псевдонимы System.Int32, System.Double, System.Single и другие.

Классы относятся к ссылочным типам (reference type).

С точки зрения размещения в памяти, между структурами и классами существует следующее отличие.

Если объявляется переменная (экземпляр) структурного типа, то этот экземпляр размещается в стеке полностью. Время жизни структуры определяется контекстом, в котором она определена. Как только переменная структурного типа выходит за пределы контекста, в котором она определена, то она сразу же удаляется из памяти.

Если объявляется переменная (ссылка) типа класса, то в стеке размещается только ссылка на экземпляр класса. Сам экземпляр размещается в области памяти, которая называется «куча» (heap). Чтобы создать экземпляр класса, обязательно нужно использовать оператор new. Удалением экземпляра класса из памяти занимается сборщик мусора (Garbage collector).

 

8. Какие есть отличия между структурами и классами?

При использовании структур и классов, можно выделить следующие основные отличия:

  • структуры принадлежат к типам значений, классы принадлежат к ссылочным типам;
  • при присваивании структур создается полная копия ее объекта, то есть выделяется память для дополнительной структуры. При присваивании классов ссылка на один класс присваивается ссылке на другой класс, и, как результат, обе ссылки указывают на один и тот же объект;
  • структуры не поддерживают наследование. Структура не может наследовать класс или другую структуру. Однако, структура может содержать переменную структурного типа;
  • в отличие от классов, в структурах нельзя объявлять (реализовывать) конструктор по умолчанию;
  • в отличие от классов, в структурах члены данных не могут быть объявлены с ключевым словом protected, поскольку структуры не поддерживают наследование;
  • в отличие от классов, структуры не поддерживают деструкторов;
  • структуры не могут объявляться с ключевыми словами abstract и virtual.

 

9. В каких случаях целесообразнее использовать структуры чем классы?

Хотя структуры владеют меньшим потенциалом чем классы, в некоторых случаях использование структур есть более эффективным. К таким случаям можно отнести случаи:

  • когда нужно сгруппировать небольшие объемы данных. В этом случае структуры используют для оптимизации продуктивности;
  • когда нужно повысить продуктивность. Структуры сохраняются в стеке, поэтому выделение/освобождение памяти происходит быстрее;
  • когда нужно сэкономить память под данные. Поскольку структуры принадлежат к типам-значениям, то при использовании структур используется меньший объем памяти. В случае с классами нужно использовать дополнительную ссылочную переменную.

Классы целесообразнее использовать в случаях:

  • когда функционала структур недостаточно для организации работы с данными;
  • когда нужно обрабатывать большие массивы информации.

 

10. Какие элементы языка программирования можно реализовывать в структуре?

В структуре можно реализовывать:

  • поля (члены данных структуры);
  • методы;
  • интерфейсы;
  • индексаторы;
  • свойства;
  • операторные методы;
  • события;
  • конструкторы (кроме конструктора по умолчанию).

 

11. Можно ли создавать объект структуры с помощью оператора new?

Можно. В этом случае после ключевого слова new вызывается конструктор по умолчанию.

Например. Использование оператора new для создания экземпляра структуры типа Date.

// Структура, которая описывает дату
struct Date
{
    public int day;
    public int month;
    public int year;
}

Демонстрация использования структуры типа Date:

// создание экземпляра структуры с помощью оператора new
Date D = new Date(); // вызывается конструктор по умолчанию

// заполнить поля структуры данными
D.day = 14;
D.month = 01;
D.year = 1972;

 

12. Поддерживают ли структуры наследование?

В отличие от классов, структуры наследование не поддерживают.

 

13. Какой один базовый класс наследуют все структуры в C#?

Все структуры неявно наследуют класс System.ValueType, который унаследован от System.Object.

 

14. Могут ли поля (члены) структуры объявляться с ключевым словом protected?

Не могут, поскольку структуры не поддерживают наследование.

 

15. Могут ли поля (члены) структуры быть объявлены с ключевыми словами abstract и virtual?

Не могут, поскольку структуры не поддерживают наследование.

 


Связанные темы