Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс_ред1 С#.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.8 Mб
Скачать

Структуры

Еще одним важным типом переменной, который широко используется в C#, является struct (сокращение от слова structure — "структура"). Структуры вполне соответствуют своему названию: это структуры данных, которые составлены из информации различного характера, возможно, из данных различных типов. Они позволяют программистам описывать свои собственные типы переменных, для которых данная структура является базовой.

В качестве примера предположим, что нам необходимо хранить информацию о маршруте из одной точки в другую, включающую направление и расстояние в километрах. Для простоты в качестве направления будет использоваться только одна из четырех сторон света (так что для описания направления вполне подойдет перечислимый тип orientation), а длина маршрута будет представлена типом double.

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

orientation myDirection;

double myDistance;

В таком подходе с использованием двух переменных нет ничего плохого, однако намного удобней (особенно если маршрутов много) хранить всю эту информацию в одном месте.

Описание структур

Для описания структур используется ключевое слово struct:

struct <имяТипа>

{

<объявлениеЧленов>

}

В разделе <объявлениеЧленов> содержатся объявления переменных (они называются полями структуры) практически в обычном формате. Объявление каждого члена имеет следующий вид:

<доступ> <тип> <имя>;

Для того чтобы код, обращающийся к структуре, имел доступ к ее полям, в разделе <доступ> следует использовать ключевое слово public (общий). Например:

struct route

{

public orientation direction;

public double distance;

}

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

route myRoute;

Для получения доступа к отдельным полям этой составной переменной следует использовать точку:

myRoute.direction = orientation.north;

myRoute.distance = 2.5;

Рассмотрим использование этого типа на примере.

using System;

namespace Route

{

class Program

{

enum orientation : byte

{

north = 1,

south = 2,

east = 3,

west = 4

}

struct route

{

public orientation direction;

public double distance;

}

static void Main(string[] args)

{

route myRoute;

int myDirection = -1;

double myDistance;

Console.WriteLine("1) North (Север)\n2) South(Юг)\n" +

"3) East(Восток)\n4) West(Запад)");

do

{

Console.WriteLine("Выберите направление:");

myDirection = Convert.ToInt32(Console.ReadLine());

}

while ((myDirection < 1) || (myDirection > 4));

Console.WriteLine("Задайте расстояние:");

myDistance = Convert.ToDouble(Console.ReadLine());

myRoute.direction = (orientation)myDirection;

myRoute.distance = myDistance;

Console.WriteLine("myRoute содержит направление {0} и " +

"расстояние {1} км", myRoute.direction,

myRoute.distance);

Console.ReadLine();

}

}

}

Структуры, так же как и перечислимые типы, описываются вне основного тела кода. Поэтому структура route описана внутри класса программы, в том же месте, в котором описывается используемый данной структурой тип orientation.

Главная функция программы осуществляет запрос входной информации у пользователя и вывод ее на экран. При этом выполняется несложная проверка допустимости вводимой информации: ввод направления помещается внутрь цикла do, любая введенная информацию, не являющуюся целым числом в диапазоне от 1 до 4 (эти значения соответствуют членам перечислимого типа) отбрасывается.

Еще один момент, на который следует обратить внимание, заключается в том, что работа с полями переменной типа route строится точно таким же образом, как если бы мы обращались к переменным того типа, что и эти поля. Присваивание, например, выполняется следующим образом:

myRoute.direction = (orientation)myDirection;

myRoute.distance = myDistance;

Можно непосредственно присваивать введенное значение полю myRoute.distance без каких бы то ни было нежелательных последствий:

myRoute.distance = Convert.ToDouble(Console.ReadLine());

Наличие дополнительного шага позволяет проверять вводимые значения, хотя в самом коде такая проверка не осуществляется.

Любой доступ к полям структуры организовывается аналогичным образом. Вполне допустимо считать, что выражения типа переменнаяТипаСтруктуры.переменнаяТипаПоля представляют собой переменную типа переменнаяТипаПоля.