Основы языка C#
Класс Array
Для более детального понимания особенностей использования массивов в C# необходимо рассмотреть специализированный класс, реализующий функции массива. Как уже упоминалось ранее, все типы данных в C# являются классами, для которых в качестве базового выступает класс Object. Класс Array - не исключение. Он реализует все базовые свойства классов и является предком для всех типов массивов, к которым мы привыкли в языке C++ и синтаксис описания которых был приведен выше. То, что класс Array является потомком класса Object, кажется на первый взгляд малоинтересным фактом, однако на самом деле говорит о многом. В частности, благодаря этому в классе Array оказывается определено множество разнообразных операций, таких как копирование, поиск, обращение, сортировки и т. д.
Ниже приведены наиболее интересные методы класса Array
Рассмотрим пример использования класса Array. Для этого создадим массив и обеспечим возможность поиска в нем элементов.
Объявим массив myArray как статический член класса Page, состоящий из шести элементов типа int:
static Array myArray = Array.CreateInstance(typeof(Int32), 6);
Разместим на форме элементы TextBox и Button, которым присвоим имена tb_value и btn_find соответственно, как показано на рис. 3.3.
В обработчик процедуры нажатия на кнопку введем следующий код, заполняющий массив случайными числами, сортирующий его и осуществляющий поиск введенного в текстовое поле элемента. Код процедуры нажатия на кнопку приведен ниже.
protected void btn_find_Click(object sender, EventArgs e) { Random rnd = new Random(); Response.Write("Исходный массив <br/>"); for (int i = myArray.GetLowerBound(0); i <= myArray.GetUpperBound(0); i++) { myArray.SetValue(rnd.Next(1, 10), i); Response.Write(myArray.GetValue(i) + "\t"); } Response.Write("<br/>"); Array.Sort(myArray); Response.Write("После сортировки:<br/>"); for (int i = myArray.GetLowerBound(0); i <= myArray.GetUpperBound(0); i++) { Response.Write(myArray.GetValue(i) + "\t"); } object o = Convert.ToInt32(tb_value.Text); int findIndex = Array.BinarySearch(myArray, o); if (findIndex<0) { Response.Write("<br/>Элемент не найден"); } else { Response.Write("<br/>Элемент найден в позиции <b>"+findIndex. ToString()+"</b>"); } }
Пример работы программы в результате выполнения приведенного выше кода представлен на рис. 3.4.
Как видно, работать с массивами в C# достаточно просто, в особенности учитывая довольно большие возможности класса Array.
Перечисления
При работе с современными языками программирования можно заметить, что часто вместо цифровых констант и значений используются имена. Так происходит, например, при указании цвета того или иного элемента управления либо объекта. Обычно цвет задается в виде кодов, соответствующих интенсивности каждой его составляющей: красного, зеленого, синего цвета; однако это неудобно, т. к. не является наглядным представлением получаемого в результате цвета. Для решения задачи упрощения использования цветов применяется именованная совокупность цветов, сопоставляющая код с наименованием. Это дает возможность в программном коде использовать имена наиболее часто употребляемых цветов. Например, цвет текста, выводимого на экран с помощью элемента Label, можно задать с помощью команды
Label1.ForeColor=Color.Red;
В данном случае имя Red соответствует красному цвету из набора цветов Colors. Такие наборы называются перечислениями.
Перечисление можно создать следующим образом:
enum OrganizationType { Education, Trade, Manufacture, Services }
Перечисление OrganizationType определяет четыре именованные константы, каждой из которых соответствует определенное числовое значение. По умолчанию первому элементу перечисления соответствует значение 0, второму - 1, третьему - 2 и т. д.
При необходимости точку отсчета номеров можно изменить. В следующем примере нумерация элементов перечисления начинается с числа 10:
enum OrganizationType { Education=10, Trade, Manufacture, Services }
Номера, присваиваемые переменным, не обязательно должны идти последовательно. Они могут быть расположены в произвольном порядке.
По умолчанию к элементам перечисления применяется тип данных int. Однако для элементов перечисления можно использовать любой целочисленный тип данных, например byte:
enum OrganizationType:byte { Education, Trade, Manufacture, Services }
Все перечисления в C# происходят от единого базового класса System.Enum. Этот класс содержит методы, существенно облегчающие работу с перечислениями. Так, статический метод GetUnderlyingType() позволяет получить информацию о том, какой тип данных используется для представления числовых значений элементов перечисления.
Например, следующая строка выведет на экран System.Byte, соответствующий типу элементов перечисления OrganizationType:
Response.Write(Enum.GetUnderlyingType(typeof(OrganizationType)));
Enum позволяет получить значимые имена элементов перечисления по их числовым значениям. Для этого используется статический метод Format(). Следующий пример выведет на экран наименование элемента перечисления OrganizationType, которому соответствует значение 2 (в данном случае — Manufacture ):
Response.Write(Enum.Format(typeof(OrganizationType),(byte)2,"G"));
Параметр "G", указанный в функции Format, задает режим вывода строки результата. G означает, что результат будет выводиться в виде строки. Возможны еще два параметра форматирования. X - шестнадцатеричное представление результата, d - десятичное значение.
В классе System.Enum существует также метод, позволяющий создать массив на основе указанного перечисления. Например, следующая строка создает массив а, состоящий из 4 элементов. В первый элемент будет записано значение Education, во второе - Trade и т. д.
Array a = Enum.GetValues(typeof(OrganizationType));
Если нужно определить, является ли символьная строка элементом перечисления, необходимо использовать свойство IsDefined класса Enum. Следующие примеры демонстрируют применение этого свойства. В первом случае результат проверки будет положительным, во втором - отрицательным:
bool r = Enum.IsDefined(typeof(OrganizationType), "Trade"); bool r1 = Enum.IsDefined(typeof(OrganizationType), "Entertainment");