Console.WriteLine("myRoute specifies a direction of {0} and a “ +
"distance of {1}", myRoute.direction, myRoute.distance);
}
}
}
Структуры, так же как и перечислимые типы, описываются вне основного тела кода. Мы описали структуру route внутри объявления пространства имен, в том же месте, в котором описывается используемый данной структурой тип orientation:
{
north = 1,
south -2,
east = 3,
}
{
public orientation direction;
public double distance;
}
Основное тело кода имеет схожую структуру с некоторыми примерами, встречавшимся нам ранее: запрос входной информации у пользователя и вывод ее на экран. Выполняется некоторая несложная проверка допустимости вводимой информации, помещая выбор направления внутрь цикла do и отбрасывая любую введенную информацию, не являющуюся целым числом в диапазоне от 1 до 4 (эти значения для упрощения процедуры присваивания соответствуют членам перечислимого типа).
Работа с полями переменной типа route строится точно таким же образом, как если бы мы обращались к переменным того типа, что и эти поля. Присваивание, например, выполняется следующим образом:
myRoute.direction = (orientation)myDirection;
rayRoute.distance = myDistance;
Можно непосредственно присваивать введенное значение полю myRoute.distance без каких бы то ни было нежелательных последствий:
Наличие дополнительного шага позволяет проверять вводимые значения, хотя в самом коде такая проверка не осуществляется. Любой доступ к полям структуры организовывается аналогичным образом. Допустимо считать, что выражения типа переменнаяТипаСтруктуры.переменнаяТипаПоля представляют собой переменную типа переменнаяТипаПоля.
Все типы переменных, которые мы рассматривали до сих пор, обладают одним общим свойством: в них хранится единственное значение (или — в случае структур — единственный набор значений). Но в ситуациях, когда необходимо хранить большое количество однородных данных, такой подход может оказаться не совсем удобным. В таких случаях более приемлемым было бы одновременное хранение нескольких значений одного типа без использования отдельной переменной для каждого значения. Предположим, к примеру, что вам необходимо выполнить вычисления, в которых задействованы имена всех ваших друзей. Для этого можно воспользоваться обычными переменными типа string, например, так:
string friendName1 = “ Robert Barwell";
string friendName2 = "Mike Parry";
string friendName3 = "Jeremy Beacock";
Однако в этом случае вам потребуется затратить много усилий, особенно по мере написания кода для обработки каждой переменной в отдельности. Отсутствует и возможность пройти по всему этому списку строк в цикле. Альтернативной возможностью является использование массивов. Массив представляет собой список индексированных переменных. Допустим, что у нас имеется массив, в котором хранятся все три имени, приведенные выше, и который называется friendNames. Тогда мы получаем доступ к отдельным элементам этого массива, просто указывая их индекс в квадратных скобках, как показано в следующем примере:
friendNames[<индекс>]
Индекс — это целое число, имеющее значение 0 для первого вхождения, 1 - для второго и т. д. Это означает, что у нас появляется возможность пройти все вхождения в цикле, например:
int i;
for (i = 0; i < 3; i++)
{
Console. WriteLine ("Имя с индексом {0}: {1)", i, friendNames [i].) ;
}
Каждый массив обладает единым базовым типом,т. е. все отдельные вхождения в массив имеют один и тот же тип. В данном случае массив friendNames имеет базовый тип string, поскольку он предназначается для хранения переменных типа string. Вхождения массива часто называются элементами.