Структуры Еще одним типом переменной, который мы будем рассматривать, является struct (сокращение от слова structure — "структура"). Структуры вполне соот- ветствуют своему названию: это структуры данных, которые составлены из инфор- мации различного характера, возможно, из данных различных типов. Они позволяют программистам описывать свои собственные типы переменных, для которых дан- ная структура является базовой. В качестве примера предположим, что нам необ- ходимо хранить информацию о маршруте из одной точки в другую, включающую направление и расстояние в милях. Для простоты в качестве направления будет использоваться только одна из четырех сторон света (так что для описания направ- ления вполне подойдет перечислимый тип orientation), а длина маршрута будет представлена типом double. В этом случае мы могли бы использовать две разные переменные, написав уже знакомый нам код: , ; : • " • • • ' • • ' : • • • С 1 - - ' • • • : • : : • • • . . . ' : ' ' • - ; ' • ' • • • • . ^ v J double myDistance; В таком подходе с использованием двух переменных нет ничего плохого, однако намного удобней (особенно если маршрутов много) хранить всю эту информацию в одном месте. Описание структур Для описания структур используется ключевое слово struct: struct <имяТипа> { . • • .. :•,•„ <объявлениеЧлена> ^ Ш ^ Ж ^ Ш Ш ^ ' ^ Ш ' : ;::-;й!:?::•••-•'•• •• •' *• •'-••.'•••• ':^0:-Ш.-.Шг-0ШШМ^ШШ^ .^ ^... - • Л;.:,,' В разделе <объявлениеЧлена> содержатся объявления переменных (они называ- ются полями) практически в обычном формате. Объявление каждого члена имеет следующий вид: <доступ> <тил> <имя>; Для того чтобы код, обращающийся к структуре, имел доступ к ее полям, в разде- ле <доступ> следует использовать ключевое слово public (общий). Например: struct route •'.'••[•'•'. • ': p u b l i c o r i e n t a t i o n d i r e c t i o n ; ;'.. • ' :. .••". public double distance; После того как мы описали структуру, мы можем использовать ее для описания переменных соответствующего типа: route myRoute,* Для получения доступа к отдельным полям этой составной переменной следует использовать точку: . _ myRoute.direction = orientation.north; myRoute.distance = 2.5; Давайте рассмотрим использование этого типа на примере. Дополнительные сведения о переменных 91 Практикум: использование структуры 1. Создайте новое консольное приложение с именем спО5ЕхОЗ В директории C:\BegCSharp\Chapter5. 2. Добавьте следующий код в ciassi.cs: namespace ChO5ExO3 X«^w , ^ « enum orientation : byte { north = 1, south -2, east = 3, west = 4 } • . • ' ' • ;\'.'-Щ/:.. :;Г;; struct route { public orientation direction; public double distance; } /// <summary> /// Summary description for Classl. /// </summary> class Classl { static void Main (string [] args) { route myRoute; int myDirection = -1; double myDistance; Console.WriteLineCD North\n2) South\n3) East\n4) West"); do { Console. WriteLine ("Select a direction:'') ; myDirection = Convert.Tolnt32(Console.ReadLineO); } while ((myDirection < 1) I I (myDirection > 4)); Console.WriteLineСInput a distance:"); myDistance = Convert .To'Double (Console.ReadLine ()) ; myRoute.direction = (orientation)myDirection; myRoute. distance •= myDistance ; Console.WriteLine("myRoute specifies a direction of {0} and a * + "distance of {1}", myRoute.direction, myRoute.distance); 3. Запустите программу, выберите направление и введите расстояние: [^;C:\8egCSharp\Chapter5\Ch05eH03\bin \Debug\Ch 1> North 2> South 3> East 4> West Select a direction* 3 Input a distance: n^Boiite specifies a direction of east and a distance of 40.3 Press any &ey to continue Q2 Глава 5 Как это работает Структуры, так же как и перечислимые типы, описываются вне основного тела кода. Мы описали структуру route внутри объявления пространства имен, в том же месте, в котором описывается используемый данной структурой тип orientation: enum orientation : byte { , . north = 1, south = 2, east • 3, west = 4, } . ' struct route { public orientation direction; public double distance; } Основное тело кода имеет схожую структуру с некоторыми примерами, встре- чавшимся нам ранее: запрос входной информации у пользователя и* вывод ее на экран. Мы выполняем некоторую несложную проверку допустимости вводимой информации, помещая выбор направления внутрь цикла do и отбрасывая любую введенную информацию, не являющуюся целым числом в диапазоне от 1 до 4 (эти значения для упрощения процедуры присваивания соответствуют членам перечис- лимого типа). Еще один интересный момент, на который следует обратить внимание, заклю- чается в том, что работа с полями переменной типа route строится точно таким же образом, как если бы мы обращались к переменным того типа, что и эти поля. Присваивание, например, выполняется следующим образом: myRoute.direction = (orientation)myDirection; rayRoute.distance = myDistance; В принципе мы могли бы непосредственно присваивать введенное значение полю myRoute.distance без каких бы то ни было нежелательных последствий: myRoute.distance = Convert.ToDouble(Console.ReadLineO); Наличие дополнительного шага позволяет проверять вводимые значения, хотя в самом коде такая проверка не осуществляется. Любой доступ к полям структуры организовывается аналогичным образом. До- пустимо Считать, ЧТО выражения ТИПа переменнаяТипаСтруктуры.переменнаяТипаПоля ПреДСТавЛЯЮТ СОбоЙ переменную ТИПа переменнаяТипаПоля.
|