Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 38
Текст из файла (страница 38)
Неявно типизированные массивы Как пояснялось в главе 3, в версии С() 3.0 появилась возможность объявлять неявно типизированные переменные с помощью ключевого слова уаг. Это переменные, тип которых определяется компилятором, исходя из типа инициализирующего выражения. Следовательно, все неявно типизированные переменные должны быть непременно инициализированы. Используя тот же самый механизм, можно создать и неявно типизированный массив. Как правило, неявно типизированные массивы предназначены для применения в определенного рода вызовах, включающих в себя элементы языка 1Д]5)О, о котором речь пойдет в главе 19.
А в большинстве остальных случаев используется "обычное" объявление массивов. Неявно типизированные массивы рассматриваются здесь лишь ради полноты представления о возможностях языка С(). Неявно типизированный массив объявляется с помощью ключевого слова наг, но без последующих квадратных скобок 1]. Кроме того, неявно типизированный массив должен быть непременно инициализирован, поскольку по типу инициализаторов определяется тип элементов данного массива. Все инициализаторы должны быть одного и того же согласованного типа.
Ниже приведен пример объявления неявно типизированного массива. чагча1з=пен(] ( 1, 2, 3, 4, 5); В данном примере создается массив типа Ьпс, состоящий из пяти элементов. Ссылка на этот массив присваивается переменной ча1з. Следовательно, тип этой переменной соответствует типу Ьпс массива, состоящего из пяти элементов. Обратите внимание на то, что в левой части приведенного выше выражения отсутствуют квадратные скобки [].
А в правой части этого выражения, где происходит инициализация массива, квадратные скобки присутствуют. В данном контексте они обязательны. Рассмотрим еще один пример, в котором создается двумерный массив типа к[оп)71е: наг уа1з = лен[,) ( (1.1, 2.2), (3.3, 4.4),( 5.5, 6.6) ); В данном случае получается массив на1з размерами 2н3. Объявлять можно также неявно типизированные ступенчатые массивы.
В качестве примера рассмотрим следующую программу: // Продемонстрировать неявно типизированный // ступенчатый массив. Глава 7. Мвссивн и строки 189 пвьпд Яуясеао с1авя Оаддек( ( апак1с уоьп Маап() ( чаг 3аддеб = пен[] ( пеи[] ( 1, 2, 3, 4 пен[] ( 9, 8, 7 ), пеи[] ( 11, 12, 13, 14, 15 ) )т гог(ьпс 3 - От 3 < заддек(.ьепдсь) 3++) ( Гсг(тпк 1-04 1 < ]аддес[3].Ьепдклт 1+4) сспас1е .нгьсе (3аддеп [3 ) [1] + " " ) т Сспло1е.игькепапе()т ) ) ) Выполнение этой программы дает следующий результат: 1234 987 11 12 13 14 15 Обратите особое внимание на объявление массива 3 аддесй сап 3 адде<( = пеи (] ( пен(] (1, 2, 3, 4 лен[](9,8,7 пеи[] ( 11, 12, 13, 14, 15 ) Как видите, оператор пеи [ ] используется в этом объявлении двояким образом.
Вопервых, этот оператор создает массив массивов. И во-вторых, он создает каждый массив в отдельности, исходя из количества инициализаторов и их типа. Как и следовало ожидать, все инициализаторы отдельных массивов должны быть одного и того же типа. Таким образом, к объявлению любого неявно типизированного ступенчатого массива применяется тот же самый общий подход, что и к объявлению обычных ступенчатых массивов. Как упоминалось выше, неявно типизированные массивы чаще всего применяются в ] ПЩ-ориентированных запросах. А в остальных случаях следует использовать явно типизированные массивы. Оператор цикла йотеасЬ Как упоминалось в главе 5, в языке С№ определен оператор цикла гогеас]т, но его рассмотрение было отложено до более подходящего момента.
Теперь этот момент настал. Оператор гогеас]т служит для циклического обращения к элементам коллею4ии, представляюшей собой группу объектов. В С№ определено несколько видов коллекций, каждая из которых является массивом. Ниже приведена общая форма оператора цикла гогеас]п Гсгеасп (тип имя переменной цикла 1п «сллекция) оператор; 190 Часть!. язык Сз Здесь тип имя переменной цикла обозначает тип и имя переменной управления циклом, которая получает значение следующего элемента коллекции на каждом шаге выполнения цикла гогеасп. А коллекция обозначает циклически опрашиваемую коллекцию, которая здесь и далее представляет собой массив.
Следовательно, тип переменной цикла должен соответствовать типу элемента массива Начиная с версии С)) 3.0, тип может также обозначаться ключевым словом чаг. В этом случае компилятор определяет тип переменной цикла, исходя из типа элемента массива. Это может оказаться полезным для работы с определенного рода запросами, как будет показано далее в данной книге. Но, как правило, тип указывается явным образом.
Оператор цикла т о ге а с)т действует следующим образом. Когда цикл начинается, первый элемент массива выбирается и присваивается переменной цикла. На каждом последующем шаге итерации выбирается следующий элемент массива, который сохраняется в переменной цикла. Цикл завершается, когда все элементы массива окажутся выбранными. Следовательно, оператор тогеас)т циклически опрашивает массив по отдельным его элементам от начала и до конца.
Следует, однако, иметь в виду, что переменная цикла в операторе тогеасп служит только для чтения. Это означает, что, присваивая этой переменной новое значение, нельзя изменить содержимое массива Ниже приведен простой пример применения оператора цикла г огеасп. В этом примере сначала создается целочисленный массив и задается ряд его первоначальных значений, а затем эти значения выводятся, а по ходу дела вычисляется их сумма. // Использовать оператор цикла топеасв.
ив1нч Бувпелц с1авв Гогевспввпю ( впапхс чо1п( иван() ( 1пс вив От 1пс[] оиив лен 1сп[10]т О Задать первоначальные значения элементов // массива пизв. гот(1пс 1 = 0; 1 < 10т 1+~) пипа [1) = 1; О Использовать цикл тотевс)т для вывода значений // элементов массива и подсчета их суммы. тогввсп(1ви х 1п оиив) ( СОПВО1в.нттпвпгвв(пЗНВЧЕНИЕ ЭЛЕМЕНта раВНО: " В Х)т вим += х; ) Сопво1е.нггпеьгпе(ьСуьыа равна: " + виы)т ) Выполнение приведенного выше кода дает следующий результат: Значение элемента равно: 0 Значение элемента равно: 1 Значение элемента равно: 2 Значение элемента равно: 3 Значение элемента равно: 4 Глава 7.
Массивы и строки 191 Значение элемента равно: 5 Значение элемента равно: б Значение элемента равно: 7 Значение элемента равно: 8 Значение элемента равно: 5 СУмма равна: 45 Как видите, оператор гогеасп циклически опрашивает массив по порядку индексирования от самого первого до самого последнего его элемента. Несмотря на то что цикл гогеасп повторяется до тех пор, пока не будут опрошены все элементы массива, его можно завершить преждевременно, воспользовавшись оператором Ьгеак. Ниже приведен пример программы, в которой суммируются только пять первых элементов массива пцвз. // Использовать оператор ЬгеаК для преждевременного // завершения цикла Еогеасп. цягпд 5уясепп с1аяз Гогеаспоепю ( ягаг1с чогц Магд() ( ьпг яцв = 07 гпг[) пцвя = пен гик[10) // Задать первоначальные значения элементов // массива пцвя.
Гог(ьпг 1 = От 1 < 10) 1+т) пцвя[1) 1; // Использовать цикл Гогеасп для вывода значений // элементов массива и подсчета их суммы. Гогеасп(гпг х 1п ппвя) ( сопяо1е.нг1сеь1пе("значение элемента равно: " + х) яшп += х) 15(х == 4) ЬгеаК) // прервать цикл, как только // индекс массива достигнет 4 ) Сопяо1е.иг1ге51пе("Сумма первых 5 элементов: " + зшп) т ) ) Вот какой результат дает выполнение. этой программы: Значение элемента равно: 0 Значение элемента равно: 1 Значение элемента равно. "2 Значение элемента равно.
"3 Значение элемента равно: 4 Сумма первых 5 элементов: 10 Совершенно очевидно, что цикл гогеасп завершается после выбора и вывода значения пятого элемента массива Оператор цикла гогеасп можно также использовать для циклического обращения к элементам многомерного массива. В этом случае элементы многомерного массива возвращаются по порядку следования строк от первой до последней, как демонстрирует приведенный ниже пример программы. 192 Часть (. Язык С() // Испольэовать оператор цикла Еогеасп для обращения // к двумерному массиву.
цзьпд Зувпещ; с1аза Гогеасппещо2 ( агавгс чогд Магп() ( Епг зша = 0; Епг(,) пцща = пеи Епв(3,5]; // Задать первоначальные значения элементов // массива пцщз. еог(1пс 1 0) 1 < 3) Ет+) ЕОГ (ЕПС 3 0; 3 < 5) 3++) пцщэ[ 1, 3 ) = (1+1) * (3+1); // Использовать цикл Еогеасв для вывода значений // элементов массива и подсчета их суммы.