Добавить в цитаты Настройки чтения

Страница 39 из 188

Как видите, после присваивания переменной nums2 значения переменной nums1обе переменные ссылки на массив ссылаются на один и тот же объект.Применение свойства Length

Реализация в C# массивов в виде объектов дает целый ряд преимуществ. Одно изних заключается в том, что с каждым массивом связано свойство Length, содержащеечисло элементов, из которых может состоять массив. Следовательно, у каждого массива имеется специальное свойство, позволяющее определить его длину. Ниже приведенпример программы, в которой демонстрируется это свойство.// Использовать свойство Length массива.using System;class LengthDemo { static void Main() { int[] nums = new int[10]; Console.WriteLine("Длина массива nums равна " + nums.Length); // Использовать свойство Length для инициализации массива nums. for (int i=0; i < nums.Length; i++) nums[i] = i * i; // А теперь воспользоваться свойством Length // для вывода содержимого массива nums. Console.Write("Содержимое массива nums: "); for(int i=0; i < nums.Length; i++) Console.Write(nums[i] + " "); Console.WriteLine(); }}

При выполнении этой программы получается следующий результат.Длина массива nums равна 10Содержимое массива nums: 0 1 4 9 16 25 36 49 64 81

Обратите внимание на то, как в классе LengthDemo свойство nums.Length используется в циклах for для управления числом повторяющихся шагов цикла. У каждогомассива имеется своя длина, поэтому вместо отслеживания размера массива вручнуюможно использовать информацию о его длине. Следует, однако, иметь в виду, что значение свойства Length никак не отражает число элементов, которые в нем используются на самом деле. Свойство Length содержит лишь число элементов, из которыхможет состоять массив.

Когда запрашивается длина многомерного массива, то возвращается общее числоэлементов, из которых может состоять массив, как в приведенном ниже примере кода.// Использовать свойство Length трехмерного массива.using System;class LengthDemo3D { static void Main() { int[,,] nums = new int[10, 5, 6]; Console.WriteLine("Длина массива nums равна " + nums.Length); }}

При выполнении этого кода получается следующий результат.Длина массива nums равна 300

Как подтверждает приведенный выше результат, свойство Length содержит числоэлементов, из которых может состоять массив (в данном случае — 300 (10×5×6) элементов). Тем не менее свойство Length нельзя использовать для определения длинымассива в отдельном его измерении.

Благодаря наличию у массивов свойства Length операции с массивами во многихалгоритмах становятся более простыми, а значит, и более надежными. В качестве примера свойство Length используется в приведенной ниже программе с целью поменятьместами содержимое элементов массива, скопировав их в обратном порядке в другоймассив.// Поменять местами содержимое элементов массива.using System;class RevCopy { static void Main() { int i, j; int[] nums1 = new int[10]; int[] nums2 = new int[10]; for(i=0; i < nums1.Length; i++) nums1[i] = i; Console.Write("Исходное содержимое массива: "); for(i=0; i < nums2.Length; i++) Console.Write(nums1[i] + " "); Console.WriteLine(); // Скопировать элементы массива nums1 в массив nums2 в обратном порядке. if(nums2.Length >= nums1.Length) // проверить, достаточно ли // длины массива nums2 for(i=0, j=nums1.Length-1; i < nums1.Length; i++, j--) nums2[j] = nums1[i]; Console.Write("Содержимое массива в обратном порядке: "); for(i=0; i < nums2.Length; i++) Console.Write(nums2[i] + " "); Console.WriteLine(); }}

Выполнение этой программы дает следующий результат.Исходное содержимое массива: 0 1 2 3 4 5 6 7 8 9Содержимое массива в обратном порядке: 9 8 7 6 5 4 3 2 1 0



В данном примере свойство Length помогает выполнить две важные функции. Во-первых, оно позволяет убедиться в том, что длины целевого массива достаточно дляхранения содержимого исходного массива. И во-вторых, оно предоставляет условиедля завершения цикла for, в котором выполняется копирование исходного массива вобратном порядке. Конечно, в этом простом примере размеры массивов нетрудно выяснить и без свойства Length, но аналогичный подход может быть применен в целомряде других, более сложных ситуаций.Применение свойства Length при обращении со ступенчатыми массивами

Особый случай представляет применение свойства Length при обращении со ступенчатыми массивами. В этом случае с помощью данного свойства можно получитьдлину каждого массива, составляющего ступенчатый массив. В качестве примера рассмотрим следующую программу, в которой имитируется работа центрального процессора (ЦП) в сети, состоящей из четырех узлов.// Продемонстрировать применение свойства Length// при обращении со ступенчатыми массивами.using System;class Jagged { static void Main() { int[][] network_nodes = new int[4][]; network_nodes[0] = new int[3]; network_nodes[1] = new int[7]; network_nodes[2] = new int[2]; network_nodes[3] = new int[5]; int i, j; // Сфабриковать данные об использовании ЦП. for(i=0; i < network_nodes.Length; i++) for(j=0; j < network_nodes[i].Length; j++) network_nodes[i][j] = i * j + 70; Console.WriteLine("Общее количество узлов сети: " + network_nodes.Length + "n"); for(i=0; i < network_nodes.Length; i++) { for(j=0; j < network_nodes[i].Length; j++) { Console.Write("Использование в узле сети " + i + " ЦП " + j + ": ") ; Console.Write(network_nodes[i][j] + "% "); Console.WriteLine(); } Console.WriteLine(); } }}

При выполнении этой программы получается следующий результат.Общее количество узлов сети: 4Использование в узле 0 ЦП 0: 70%Использование в узле 0 ЦП 1: 70%Использование в узле 0 ЦП 2: 70%Использование в узле 1 ЦП 0: 70%Использование в узле 1 ЦП 1: 71%Использование в узле 1 ЦП 2: 72%Использование в узле 1 ЦП 3: 73%Использование в узле 1 ЦП 4: 74%Использование в узле 1 ЦП 5: 75%Использование в узле 1 ЦП 6: 76%Использование в узле 2 ЦП 0: 70%Использование в узле 2 ЦП 1: 72%Использование в узле 3 ЦП 0: 70%Использование в узле 3 ЦП 1: 73%Использование в узле 3 ЦП 2: 76%Использование в узле 3 ЦП 3: 79%Использование в узле 3 ЦП 4: 82%

Обратите особое внимание на то, как свойство Length используется в ступенчатоммассиве network_nodes. Напомним, что двумерный ступенчатый массив представляет собой массив массивов. Следовательно, когда используется выражениеnetwork_nodes.Length

то в нем определяется число массивов, хранящихся в массиве network_nodes (в данном случае — четыре массива). А для получения длины любого отдельного массива,составляющего ступенчатый массив, служит следующее выражение.network_nodes[0].Length

В данном случае это длина первого массива.Неявно типизированные массивы

Как пояснялось в главе 3, в версии C# 3.0 появилась возможность объявлять неявнотипизированные переменные с помощью ключевого слова var. Это переменные, типкоторых определяется компилятором, исходя из типа инициализирующего выражения. Следовательно, все неявно типизированные переменные должны быть непременно инициализированы. Используя тот же самый механизм, можно создать и неявнотипизированный массив. Как правило, неявно типизированные массивы предназначены для применения в определенного рода вызовах, включающих в себя элементыязыка LINQ, о котором речь пойдет в главе 19. А в большинстве остальных случаевиспользуется "обычное" объявление массивов. Неявно типизированные массивы рассматриваются здесь лишь ради полноты представления о возможностях языка С#.

Неявно типизированный массив объявляется с помощью ключевого слова var, нобез последующих квадратных скобок []. Кроме того, неявно типизированный массив должен быть непременно инициализирован, поскольку по типу инициализаторов определяется тип элементов данного массива. Все инициализаторы должны бытьодного и того же согласованного типа. Ниже приведен пример объявления неявно типизированного массива.var vals = new[] { 1, 2, 3, 4, 5 };