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

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


Содержание



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. Какое отличие между структурой и классом с точки зрения их представления в памяти?

Структуры относятся к типам значения. Это означает, что память для переменных типа структура выделяется сразу при их объявлении. К типам значения относятся и базовые типы данных такие как short, int, uint, double, float, bool, string и прочие. Доступ к полям структуры выполняется непосредственно.

Выделять память для структурной переменной с помощью оператора new необязательно (но можно).

Классы относятся к ссылочным типам. Это означает, что для объекта класса (переменной типа «класс») обязательно нужно выделять память с помощью оператора new.

 

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#?

Все структуры наследуют класс object. Другие классы или структуры не могут быть унаследованы структурами.

 

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

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

 

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

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

 


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