Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 37
Текст из файла (страница 37)
В качестве примера рассмотрим следующую программу: // Присваивание ссылок на массивы. сягпЯ Зуякеяо с1аяя аяя1чпанет ( якак1с чо1т[ Ма1п() ( 1пк 1) ьпк[] ппия1 = пеи ьпк[10] гпк[] ппия2 = пеи ьпк[10] Гол(1=0] 1 < 10] 1+а) пиыя1[1] = 5.; Гог(1=0] 1 < 10) 1++) псия2[1] = -1) Сопяо1е.икьке("Содержимое массива пиия1: ")т Гол(1=0] 1 < 10," 1++) Сопяо1е.ит1се(ппыя1[1] + " "); Сопяо1е.иг1кеььпе()т Сопяо1е.игксе("Содержимое массива псыя2: ")т Гог(1=0) 1 < 10] 1++) 184 Часть ). Язык Сз Сопзо1е.иггсе(повз2 [1] + " ") ) Сопзо1е.иг1сеЬ1пе () ~ поиз2 = поиз1; // теперь поиз2 ссылается на поиз1 Сопзо1е.игхсе("Содержимое массива поиз2 последил" т "присваивания: ")б бог(1=04 1 < 10; 1++) Сопзо1е.иг1се(пивз2[].] + " ")) Сопзо1е.иг1сеЬ1пе()4 // далее оперировать массивом поиз1 посредством // переменной ссылки на массив поиз2.
поиз2(3) = 99; Сопзо1е.иггсе("Содержимое массива ппиз1 после изменения1п" + "посредством переменной поиз2: "); бог(1=0; г < 10; 1ьь) Сопзо1е.нггге(пьвз1[1] + " "); Сопзо1е.иг1сеЬ1пе()б ) Выполнение этой программы приводит к следующему результату: Содержимое массива поиз1: 0 1 2 3 4 5 б 7 8 9 Содержимое массива поиз2: 0 -1 -2 -3 -4 -5 -б -7 -8 -9 Содержимое массива пииз2 после присваивания: 0 1 2 3 4 5 б 7 8 9 Содержимое массива ппиз1 после изменения посредством переменной поиз2: 0 1 2 99 4 5 б 7 8 9 Как видите, после присваивания переменной ппиз2 значения переменной пптз1 обе переменные ссылки на массив ссылаются на один и тот же объект.
Применение свойства ьепд~Ь Реализация в С() массивов в виде объектов дает целый ряд преимуществ. Одно из них заключается в том, что с каждым массивоМ связано свойство Ьепдсй, содержащее число элементов, из которых может состоять массив. Следовательно, у каждого массива имеется специальное свойство, позволяющее определить его длину. Ниже приведен пример программы, в которой демонстрируется это свойство. // Использовать свойство Ьепчсв массива. озхпч эузсегы с1азз Ьепчсвпево ( згагхс нохс иагп() ( 1пс[] папа = пеи гпс[10] Сопзо1е.нг1сеЬгпе("длина массива пииз равна " + пииз.ЬепдГП)) Глава 7. Массивы и строки 185 // Использовать свойство Ьепчгь дпя инициализации О массива пцвя.
Сот(апс 1=0« 1 < пцвз.ьепчси« 1++) пцвя(1] = 1. * «т О А теперь воспользоваться свойством Ьепдси // дпя вывода содержимого массива пцвя. Сопзо1е.Итаке("Содержимое массива пцвз: "); Еог(1пс 1=0« 1 < пцвз.ьепдги« 1++) Сопзо1е.ыг)се(зовя[1] + " ")« сопяо1е.иг1сеь«пе О « ) При выполнении этой программы получается следующий результат: длина массива пцвя равна 10 Содержимое массива пцвя: 0 1 4 9 16 25 36 49 64 81 Обратите внимание иа то, как в классе ьепдсппево свойство пцвз.ьепдг)« используется в циклах Гог для управления числом повторяющихся шагов цикла. У каждого массива имеется своя длина, поэтому вместо отслеживания размера массива вручную можно использовать информацию о его длине.
Следует, однако, иметь в виду, что зиачеиие свойства ьепосп никак ие отражает число элементов, которые в ием используются иа самом деле. Свойство ьепдг)«содержит лишь число элементов, из которых может состоять массив. Когда запрашивается длина многомерного массива, то возвращается общее число элементов, из которых может состоять массив, как в приведенном ниже примере кода. О Использовать свойство Ьепсси трехмерного массива. цз1пд яуягев« с1зяз ЬепЧГПОевозо ( ягасас тога Маап() ( 1пс[,,] тпппя = пен «.по[10, 5, б]т Сопяо1е.ыг«сеЬЬпе("Длина массива пцвз равна " т пцвя.ьепЧГП)« При выполнении этого кода получается следующий результат: Длина массива пцвя равна 300 Как подтверждает приведенный выше результат, свойство ьепосп содержит число элементов, из которых может состоять массив (в данном случае — 300 ([Охбхб) элементов).
Тем ие менее свойство ьепогп нельзя использовать для определения длины массива в отдельном его измерении. Благодаря иаличию у массивов свойства ьеппс)«операции с массивами во многих алгоритмах становятся более простыми, а значит, и более надежными. В качестве примера свойство ьепдгп используется в приведенной ниже программе с целью поменять местами содержимое элементов массива, скопировав их в обратном порядке в другой массив. 186 Часть ). Язык С() // Поменять местами содержимое элементов массива. оя1пд Буясеи) с1азз аечСору ( зсаскс чоьб Мвтп() ( Ьпс 1,37 1пс(] поия1 = пен 1пс(10)т Ьпк[) пожя2 пен 1пс[10)) ток(1=0) 1 < поиз1.ьепчкпт 1++) помя1[1) = 17 Сопяо1е.искье("Исходное содержимое массива: ")) тот(1=0) 1 < поия2.ЬепЧСП7 1++) Сопзо1е.
Хк1се (пшзз1 [1) + " ") ) Сопзо1е.Икккепьпе () ) // Скопировать элементы массива пния1 в // массив пниз2 в обратном порядке. 11(помя2.Ьепдсь >= пния1.Ьепдкь) // проверить, // достаточно ли длины массива пииз2 кок(1=0, 3=пнмз1.ьепдсп-1/ ь < пниз1.ьепчсп( 1ьь, )†) по1вя2[3) = пнмз1[1)' Сопзо1е.искье("Содержимое массива в обратном порядке: ")7 кок(1=07 1 < ппив2.Ьепдкьт 1ьь) Сопяо1е.иг1те(помя2[1) + " ")7 Сопзо1е.ИкткеЬЬпе()) ) ) Выполнение этой программы дает следующий результат: Исходное содержимое массива: 0 1 2 3 4 5 б 7 8 9 Содержимое массива в обратном порядке: 9 8 7 б 5 4 3 2 1 О В данном примере свойство 1 епдтб помогает выполнить две важные функции. Вопервых, позволяет убедиться в том, что длины целевого массива достаточно для хранения содержимого исходного массива И во-вторых, предоставляет условие для завершения цикла кот, в котором выполияегся копирование исходного массива в обратном порядке.
Конечно, в этом простом примере размеры массивов нетрудно выяснить и без свойства Ьепдсб, ио аналогичный подход может быть применен в целом ряде других, более сложных ситуаций. Применение свойства Х евдо при обращении со ступенчатыми массивами Особый случай представляет применение свойства ьепдкп при обращении со ступенчатыми массивами.
В этом случае с помощью даииого свойства можно получить длину каждого массива, составляющего ступенчатый массив. В качестве примера рассмотрим следующую программу, в которой имитируется работа центрального процессора (ЦП) в сети, состоящей из четырех узлов. Глава 7. Массивы и строки 187 // Продемонстрировать применение свойства Ьепдги // при обращении со ступенчатыми массивами. няапд зуясещ) с1аяя Юаддек( ( ясасас чо1б Иа).п() ( 1пс [] [] песнбгк побея = пен 1пс [4] [] т пегиоги пес)ея[О! = пен Еле[3]; пегиоги посев[1! = пен Еле[7]; пегноги пес)ея[2] = пен Епг[2]т пегногк посев[3! пен Еле[5]; Епг 1, // Сфабриковать данные об использовании ЦП.
Еог(1 О) 1 < пегноги посев.Ьепдгн) Етт) Еог(3=0) 3 < пегногк посев[1).Ьепдги) 3+е) пегноги посев[1][3! = 1 * 3 е 70) Сопяо1е.Игагепапе("Общее количество узлов сети: пегноги пес)ея.Ьепдги + "1п")т еог(1=0; 1 < песногк посев.ьепдс)м 14+) ( Еог (3=04 3 < пегног)к побея [1] . Ьепдгп) 3+а) ( Сопяо1е.Итаке("Использование в узле сети " + 1 " ЦП " + 3 + "т ")) Сопяо1е.игаге(пегноги посев[1][3!. + "В ")т Сопяо1е.нгасеЬЕпе()т ) Сопяо1е.игагеЬЕпе()) ) ) При выполнении этой программы получается следующий результат: Общее количество узлов сети: 4 Использование в узле 0 ЦП 0: 70% Использование в узле 0 ЦП 1: 70% Использование в узле 0 ЦП 2т 70$ Использование в узле 2 ЦП 0: 70$ Использование в узле 2 ЦП 1т 72% Использование в узле 3 ЦП От 70$ Использование в узле 3 ЦП 1: 734 Использование в Использование в Использование в Использование в Использование в Использование в Использование в узле 1 узле 1 узле 1 узле 1 узле 1 узле 1 узле 1 ЦП От 70% ЦП 1: 71$ ЦП 2: 72% ЦП Зт 73$ ЦП 4: 744 ЦП 5т 75$ ЦП б: 7б%, 1ов часть(.
язык сз Использование в узле 3 ЦП 2: 76$ Использование в узле 3 ЦП 3: 79% Использование в узле 3 ЦП 4: 82$ Обратите особое внимание на то, как свойство Ьеппгп используется в ступенчатом массиве де смог)к пес[ее. Напомним, что двумерный ступенчатый массив представляет собой массив массивов. Следовательно, когда используется выражение песногх пок(ез.ьепдгь то в нем определяется число массивов, хранящихся в массиве пе смог)к пок[ез (в данном случае — четыре массива). А для получения длины любого отдельного массива, составляющего ступенчатый массив, служит следующее выражение: песногг пок(ее[0].Ьепчсй В данном случае это длина первого массива.