В этом случае можно было бы использовать две разные переменные, написав уже знакомый нам код:
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; |
3.2.4.Массивы
Все типы переменных, которые были рассматренны до сих пор, обладают одним общим свойством: в них хранится единственное значение (или – в случае структур – единственный набор значений). Но в ситуациях, когда необходимо хранить большое количество однородных данных, такой подход может оказаться не совсем удобным. В таких случаях более приемлемым было бы одновременное хранение нескольких значений одного типа без использования отдельной переменной для каждого значения.
Предположим, к примеру, что вам необходимо выполнить вычисления, в которых задействованы имена всех ваших друзей. Для этого можно воспользоваться обычными переменными типа string, например, так:
string friendNamel = "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.
Вхождения массива часто называются элементами.
Массивы объявляются следующим образом:
<базовыйТип> [ ] <имя>;
В данном случае <базовыйТип> может быть произвольным типом, в том числе перечислимым или структурой.
Прежде чем получить доступ к массиву, его необходимо инициализировать. Но получить доступ или присвоить значение элементу массива следующим образом нельзя:
int[] myIntArray; | |
myIntArray[10] = 5 |
;
Массивы могут быть инициализированы двумя способами. Мы можем либо задать полное содержимое массива в литеральной форме, либо указать размер массива и использовать для инициализации всех его элементов ключевое слово new (новый).
Определение значений элементов массива в литеральной форме предполагает задание списка значений, разделенных запятыми и заключенных в фигурные скобки. Например:
int[] mylntArray = {5, 9, 10, 2, 99};
В данном случае описывается массив, состоящий их пяти элементов, и всем им присваивается целое значение. Второй способ предполагает использование следующего синтаксиса: int[] myIntArray = new int[5];
Здесь используется ключевое слово new для явной инициализации массива и константа для определения его размера. При этом методе всем вхождениям массива будет присвоено значение по умолчанию, которое для численных типов равно 0. Для инициализации массивов вместо констант с тем же успехом можно использовать переменные, например.
int [ ] myIntArray = new int[размерМассива];
При желании можно одновременно использовать оба метода int[] myIntArray = new int[5] {5, 9, 10, 2, 99};
В этом случае размеры массива должны совпадать с количеством элементов в списке. Следующая запись является недопустимой:
int[] myIntArray = new int[10] {5, 9, 10, 2, 99};
Здесь описывается массив, состоящий из 10 элементов, а определяются только 5 из них; компиляция этой записи не пройдет. Побочным эффектом такого положения вещей является то, что если мы описываем размерность массива с помощью переменной, то она должна являться константой. Например:
const int arraySize = 5; | |
int[] myIntArray = new int [arraySize] {5, 9, 10, 2, 99} |
;
Если ключевое слово const будет пропущено, программа работать не будет.
Как и в случае переменных других типов, нет никакой необходимости инициализировать массив в той же строке, в которой он объявляется Вполне допустимой является следующая запись:
int[] myIntArray; | |
myIntArray = new int[5] |
;
Теперь вы уже знаете достаточно для того, чтобы попробовать написать некоторую программу 1. Создайте новое консольное приложение 2. Добавьте следующий код в Classl.cs.
static void Main(string[] args) {
string[] fnendNames = {"Robert Barwell", "Mike Parry", "Jeremy Beacock"}; int i;
Console.WriteLine("Here are {0} of my friends:", friendNames.Length); for (i=0; i < friendNames.Length; i++) { Console.WriteLine(friendNames[i] ) ; } }3. Запустите программу (см. рис. справа).
Как это работает
В этом коде объявляется массив типа string, состоящий из трех значений, которые затем выводятся на консоль с помощью цикла for. Обратите внимание, что существует возможность узнать общее количество элементов массива посредством параметра friendNames.Length:
Console.WriteLme("Here are {0} of my friends:"; friendNames.Length) ; Это очень удобный способ определения размера массива.
При выводе значений массива в цикле for легко допустить ошибку. Например, попытаемся вместо оператора < использовать оператор < =, как показано ниже. for (i = 0; i <= friendNames.Length; i++) {
Console.WriteLine(friendNames[i]); }
Компиляция с последующим выполнением программы приведет к появлению окна с сообщением об ошибке: "Необрабатываемая исключительная ситуация типа 'выход индекса за пределы диапазона' в ….." (см. рис. слева).
В приведенном случае мы попытались получить доступ к friendNames[3]. Как вы помните, значения индексов массива начинаются с нуля, поэтому последним элементом данного массива является friendNames[2]. Обращение к элементам массива, выходящим за его границу, приведет к ошибке. На самом деле существует более удобный способ доступа ке всем элементам массива с помощью цикла foreach.
3.2.5.Циклы foreach
Цикл foreach позволяет обращаться ко всем элементам массива с помощью очень простого синтаксиса
foreach (<базовыйТип> <имя> in <массив>) { | |
// можно использовать <имя> для доступа к очередному элементу } |
Этот цикл пройдет по всем элементам массива, последовательно помещая каждый из них в переменную <имя>; при этом опасность выхода за границы массива отсутствует. Нам не придется беспокоиться о том, сколько элементов имеется в массиве, и мы сможем воспользоваться в цикле каждым из них. Для того чтобы применить этот способ, изменим код последнего примера:
static void Main(string [] args) {
string[] friendNames = {"Robert Barwell", "Mike Parry","Jeremy Beacock"}; Console.WriteLme("Here are {0} of my friends:", friendNames.Length) ; foreach (string friendName in friendNames){
Console.WriteLine(friendName) } }
Выходной поток этой программы будет абсолютно таким же, как и в предыдущем примере.
Основное отличие этого метода от обычного цикла for заключается в том, что он позволяет использовать содержимое массива в режиме "только чтение", т. е. отсутствует возможность изменять значения элементов массива.
Например, написать такую программу нельзя:
foreach (string friendName in friendNames) { friendName = "Rupert the bear"; }При попытке откомпилировать этот код будет выдано сообщение об ошибке.
3.2.6.Многомерные массивы
Многомерный массив – это объект, в котором для осуществления доступа к его элементам используется несколько индексов.
В качестве примера представим случай, когда требуется отразить высоту возвышенности по измеряемым точкам на местности. Мы можем определить такие точки двумя координатами х и у и использовать эти координаты в качестве индексов так, чтобы в массиве с названием hillHeight хранилась высота холма, соответствующая точке с данной парой координат. Для этого потребуется использовать многомерный массив.