1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 30
Текст из файла (страница 30)
Но та же самая инструкция можетбыть переписана следующим образом:return this.width * this.height;Здесь слово this ссылается на объект, для которого вызван метод area().Следовательно, выражение this.width ссылается на копию переменной width этогообъекта, а выражение this.height — на копию переменной height того же объекта.Например, если бы метод area() был вызван для объекта с именем x, то ссылка this впредыдущей инструкции была бы ссылкой на объект x.
Запись этой инструкции безиспользования слова this — это по сути ее сокращенный вариант,Вот как выглядит полный класс Rect, написанный с использованием ссылки this:using System;class Rect {public int width;public int height;public Rect(int w, int h) {this.width = w;this.height = h;}public int area() {return this.width * this.height;}}class UseRect {public static void Main() {Rect r1 = new Rect(4, 5);Rect r2 = new Rect(7, 9);}}Console.WriteLine("Площадь прямоугольника r1: " + r1.area());Console.WriteLine("Площадь прямоугольника r2: " + r2.area());В действительности ни один C#-программист не использует ссылку this так, какпоказано в этой программе, поскольку это не дает никакого выигрыша, да и стандартнаяформа выглядит проще. Однако из this можно иногда извлечь пользу.
Например,синтаксис C# допускает, чтобы имя параметра или локальной переменной совпадало сименем переменной экземпляра. В этом случае локальное имя будет скрывать переменнуюэкземпляра. И тогда доступ к скрытой переменной экземпляра можно получить с помощьюссылки this.
Например, следующий фрагмент кода (хотя его стиль написания нерекомендуется к применению) представляет собой синтаксически допустимый способопределения конструктора Rect().152Часть I. Язык C#public Rect(int width, int height) {this.width = width;this.height = height;}В этой версии конструктора имена параметров совпадают с именами переменныхэкземпляра, в результате чего за первыми скрываются вторые, а ключевое слово this какраз и используется для доступа к скрытым переменным экземпляра.Глава 6. Введение в классы, объекты и методы153Полныйсправочник поГлава 7Массивы и строкиВэтой главе мы возвращаемся к теме типов данных языка C# (познакомимся с типомданных string).
Помимо массивов здесь будет уделено внимание использованиюцикла foreach.МассивыМассив (array) — это коллекция переменных одинакового типа, обращение к которымпроисходит с использованием общего для всех имени. В C# массивы могут бытьодномерными или многомерными, хотя в основном используются одномерные массивы.Массивы представляют собой удобное средство группирования связанных переменных.Например, массив можно использовать для хранения значений максимальных дневныхтемператур за месяц, списка цен на акции или названий книг по программированию издомашней библиотеки.Массив организует данные таким способом, который позволяет легко имиманипулировать.
Например, если у вас есть массив, содержащий дивиденды,выплачиваемые по выбранной группе акций, то, построив цикл опроса всего массива,нетрудно вычислить средний доход от этих акций. Кроме того, организация данных вформе массива позволяет легко их сортировать в нужном направлении.Хотя массивы в C# можно использовать по аналогии с тем, как они используются вдругих языках программирования, C#-массивы имеют один специальный атрибут, аименно: они реализованы как объекты. Этот факт и стал причиной того, что рассмотрениемассивов в этой книге было отложено до введения понятия объекта Реализация массивов ввиде объектов позволила получить ряд преимуществ, причем одно из них (и к тому женемаловажное) состоит в том, что неиспользуемые массивы могут автоматическиутилизироваться системой сбора мусора.Одномерные массивыОдномерный массив — это список связанных переменных.
Такие списки широкораспространены в программировании Например, один одномерный массив можноиспользовать для хранения номеров счетов активных пользователей сети. В другом —можно хранить количество мячей, забитых в турнире бейсбольной командой.Для объявления одномерного массива используется следующая форма записи.тип[] имя_массива = new тип[размер];Здесь с помощью элемента записи тип объявляется базовый тип массива. Базовыйтип определяет тип данных каждого элемента, составляющего массив. Обратите вниманиена одну пару квадратных скобок за элементом записи тип.
Это означает, что определяетсяодномерный массив. Количество элементов, которые будут храниться в массиве,определяется элементом записи размер. Поскольку массивы реализуются как объекты, ихсоздание представляет собой двухступенчатый процесс. Сначала объявляется ссылочнаяпеременная на массив, а затем для него выделяется память, и переменной массиваприсваивается ссылка на эту область памяти. Таким образом, в C# массивы динамическиразмешаются в памяти с помощью оператора new.На заметкуЕсли вы уже знакомы с языками С или C++, обратите внимание на объявлениемассивов в C# Квадратные скобки располагаются за именем типа, а не заименем массиваГлава 7. Массивы и строки155Рассмотрим пример.
При выполнении приведенной ниже инструкции создается intмассив (состоящий из 10 элементов), который связывается со ссылочной переменноймассива sample.int[] sample = new int[10];Это объявление работает подобно любому объявлению объекта. Переменная sampleсодержит ссылку на область памяти, выделенную оператором new.Доступ к отдельному элементу массива осуществляется посредством индекса. Индексописывает позицию элемента внутри массива. В C# первый элемент массива имеет нулевойиндекс. Поскольку массив sample содержит 10 элементов, его индексы изменяются от 0 до9.
Чтобы получить доступ к элементу массива по индексу, достаточно указать нужныйномер элемента в квадратных скобках. Так, первым элементом массива sample являетсяsample[0], а последним — sample[9]. Например, следующая программа помещает вмассив sample числа от 0 до 9.// Демонстрация использования одномерного массива.using System;class ArrayDemo {public static void Main() {int[] sample = new int[10];int i;for(i = 0; i < 10; i = i+1)sample[i] = i;}}for(i = 0; i < 10; i = i+1)Console.WriteLine("sample[" + i + "]: " +sample[i]);0123456789sample[0]sample[1]sample[2]sample[3]sample[4]sample[5]sample[6]sample[7]sample[8]sample[9]Результаты выполнения этой программы имеют такой вид:sample[0]: 0samp1е[1]: 1sample[2]: 2sample[3]: 3sample[4]: 4sample[5]: 5sample[6]: 6sample[7]: 7sample[8]: 8sample[9]: 9Схематично массив sample можно представить в таком виде:Массивы широко применяются в программировании, поскольку позволяют легкообрабатывать большое количество связанных переменных.
Например, следующаяпрограмма вычисляет среднее арифметическое от множества значений, хранимых в массивеnums, опрашивая в цикле for все его элементы.156Часть I. Язык C#// Вычисление среднего арифметического от// множества значений.using System;class Average {public static void Main() {int[] nums = new int[10];int avg = 0;nums[0]nums[1]nums[2]nums[3]nums[4]nums[5]nums[6]nums[7]nums[8]nums[9]}}==========99;10;100;18;78;23;63;9;87;49;for(int i=0; i < 10; i++)avg = avg + nums[i];avg = avg / 10;Console.WriteLine("Среднее: " + avg);Вот результат выполнения программы:Среднее: 53Инициализация массиваВ предыдущей программе значения массиву nums были присвоены вручную, т.е.
спомощью десяти отдельных инструкций присваивания. Существует более простой путьдостижения той же цели: массивы можно инициализировать в момент их создания. Форматинициализации одномерного массива имеет следующий вид:тип[] имя_массива = [val1, val2, ..., valN];Здесь начальные значения, присваиваемые элементам массива, задаются с помощьюпоследовательности val1—valN. Значения присваиваются слева направо, в порядкевозрастания индекса элементов массива.
C# автоматически выделяет для массива областьпамяти достаточно большого размера, чтобы хранить заданные значения инициализации(инициализаторы). В этом случае нет необходимости использовать в явном виде операторnew. Теперь рассмотрим более удачный вариант программы Average.// Вычисление среднего арифметического от// множества значений.using System;class Average {public static void Main() {int[] nums = { 99, 10, 100, 18, 78,23, 63, 9, 87, 49 };Глава 7. Массивы и строки157int avg = 0;for(int i=0; i < 10; i++)avg = avg + nums[i];}}avg = avg / 10;Console.WriteLine("Среднее: " + avg);Хотя, как уже было отмечено выше, в этом нет необходимости, при инициализациимассива все же можно использовать оператор new. Например, массив nums из предыдущейпрограммы можно инициализировать и таким способом, хотя он и несет в себе некоторуюизбыточность.int[] nums = new int[] { 99, 10, 100, 18, 78,23, 63, 9, 87, 49 };Несмотря на избыточность new-форма инициализации массива оказывается полезнойв том случае, когда уже существующей ссылочной переменной массива присваиваетсяновый массив.
Например:int[] nums;nums = new int[] { 99, 10, 100, 18, 78,23, 63, 9, 87, 49 };Здесь массив nums объявляется в первой инструкции и инициализируется во второй.И еще. При инициализации массива допустимо также явно указывать его размер, но размерв этом случае должен соответствовать количеству инициализаторов. Вот, например, ещеодин способ инициализации массива nums.int[] nums = new int[10] { 99, 10, 100, 18, 78,23, 63, 9, 87, 49 };В этом объявлении размер массива nums явно задан равным 10.Соблюдение "пограничного режима"Границы массивов в C# строго "охраняются законом". Выход за границырасценивается как динамическая ошибка. Чтобы убедиться в этом, попытайтесь выполнитьследующую программу, в которой намеренно делается попытка нарушения границ массива.// Демонстрация выхода за границу массива.using System;class ArrayErr {public static void Main() {int[] sample = new int[10];int i;}}// Организуем нарушение границы массива.for(i = 0; i < 100; i = i+1)sample[i] = i;Как только i примет значение 10, будет сгенерирована исключительная ситуациятипа IndexOutOfRangeException, и программа прекратит выполнение.158Часть I.
Язык C#Многомерные массивыНесмотря на то что в программировании чаше всего используются одномерныемассивы, их многомерные "собратья" — также не редкость. Многомерным называется такоймассив, который характеризуется двумя или более измерениями, а доступ к отдельномуэлементу осуществляется посредством двух или более индексов.Двумерные массивыПростейший многомерный массив — двумерный. В двумерном массиве позициялюбого элемента определяется двумя индексами. Если представить двумерный массив ввиде таблицы данных, то один индекс означает строку, а второй — столбец.Чтобы объявить двумерный массив целочисленных значений размером 10x20 сименем table, достаточно записать следующее:int[,] table = new int[10, 20];Обратите особое внимание на то, что значения размерностей отделяются запятой.Синтаксис первой части этого объявления[,]означает, что создается ссылочная переменная двумерного массива.
Для реальноговыделения памяти для этого массива с помощью оператора new используется болееконкретный синтаксис:int[10, 20]Тем самым обеспечивается создание массива размером 10x20, причем значенияразмерностей также отделяются запятой.Чтобы получить доступ к элементу двумерного массива, необходимо указать обаиндекса, разделив их запятой. Например, чтобы присвоить число 10 элементу массиваtable, позиция которого определяется координатами 3 и 5, можно использоватьследующую инструкцию:table[3, 5] = 10;Рассмотрим пример программы, которая заполняет двумерный массив числами от 1до 12, а затем отображает содержимое этого массива.// Демонстрация использования двумерного массива.using System;class TwoD {public static void Main() {int t, i;int[,] table = new int[3, 4];}}for(t=0; t < 3; ++t) {for(i=0; i < 4; ++i) {table[t,i] = (t*4)+i+1;Console.Write(table[t,i] + " ");}Console.WriteLine();}Глава 7.