Продолжаем рассматривать массивы. Начало смотрите в первой части.
Массив как объект
Мы уже говорили о том, что массивы в С# реализованы как объекты. Если говорить более точно, то они реализованы на основе базового класса Array, определенного в пространстве имен System. Данный класс содержит различные свойства и методы. Например, свойство Length позволяет определять количество элементов в массиве. Используя данное свойство, внесем изменения в метод Change:
static void Change(int[] a)
{
for (int i = 0; i < a.Length; i++)
{
if (a[i] > 0)
{
a[i] = 0;
}
}
}
|
Таким образом, информация о длине массива передается в метод Change неявным образом вместе с массивом, и мы избавились от необходимости вводить дополнительную переменную для хранения размерности массива.
Наиболее важные члены класса Array приведены в следующей таблице:
Элемент |
Вид |
Описание |
BinarySearch |
статический метод |
Осуществляет двоичный поиск в отсортированном массиве. |
Clear |
статический метод |
Присваивает элементам массива значения, определенные по умолчанию, т.е для арифметических типов нули, для ссылочных типов null. |
Copy |
статический метод |
Копирует элементы одного массива в другой массив. |
CopyTo |
экземплярный метод |
Копирует все элементы текущего одномерного массива в другой массив. |
IndexOf |
статический метод |
Осуществляет поиск первого вхождения элемента в одномерный массив. Если элемент найден, то возвращает его индекс, иначе возвращает значение -1. |
LastIndexOf |
статический метод |
Осуществляет поиск последнего вхождения элемента в одномерный массив. Если элемент найден, то возвращает его индекс, иначе возвращает значение -1. |
Length |
свойство |
Возвращает количество элементов в массиве |
Rank |
свойство |
Возвращает число размерностей массива. Для одномерного массива Rank возвращает 1, для двумерного – 2 и т.д. |
Reverse |
статический метод |
Изменяет порядок следования элементов в массиве на обратный. |
Sort |
статический метод |
Упорядочивает элементы одномерного массива. |
Замечание. Обратите внимание на то, что для перечисленных членов класса Array не указываются параметры. Это связано с тем, что большинство из них имеют несколько перегруженных версий, поэтому при их использовании следует обращать внимание на подсказки VS и пользоваться справочной информацией.
Вызов статических методов происходит через обращение к имени класса, например, Array.Sort(myArray). В данном случае мы обращаемся к статическому методу Sort класса Array и передаем данному методу в качестве параметра объект myArray - экземпляр класса Array.
Обращение к свойству или вызов экземплярного метода производится через обращение к экземпляру класса, например, myArray.Length или myArray.GetValue(i).
Пример:
class Program
{
static void Print(int[] a)
{
foreach (int elem in a)
{
Console.Write("{0} ", elem);
}
Console.WriteLine();
}
static void Main()
{
int[] one = { 2, 4, 6, 1, -5, 2, 9, -2 };
Console.Write("Первый массив:");
Print(one);
Console.WriteLine("Первый раз значение 2 встречается в нем в позиции {0}",
Array.IndexOf(one, 2));
Console.WriteLine("Последний раз значение 2 встречается в нем в позиции {0}",
Array.LastIndexOf(one, 2));
Array.Sort(one);
Console.Write("отсортирован по возрастанию:");
Print(one);
Array.Reverse(one);
Console.Write("отсортирован по убыванию:");
Print(one);
//создаем новый массив, копируя в него все элементы массива myArray
int[] two = new int[one.Length];
Array.Copy(one, two, one.Length);
Console.Write("\nВторой массив: ");
Print(two);
//копируем в середину массива newArray фрагмент массива myArray
Array.Copy(one, 2, two, 4, 4);
Console.Write("Вставка элементов в него: ");
Print(two);
Console.WriteLine("\nИтоговые массивы ");
Console.Write("Первый: ");
Print(one);
Console.Write("Второй: ");
Print(two);
}
}
|
Результат работы программы:
Первый массив: 2 4 6 1 -5 2 9 -2
Первый раз значение 2 встречается в нем в позиции 0
Последний раз значение 2 встречается в нем в позиции 5
отсортирован по возрастанию: -5 -2 1 2 2 4 6 9
отсортирован по убыванию: 9 6 4 2 2 1 -2 -5
Второй массив: 9 6 4 2 2 1 -2 -5
Вставка элементов в новый массив: 9 6 4 2 4 2 2 1
Итоговые массивы
Первый: 9 6 4 2 2 1 -2 -5
Второй: 9 6 4 2 4 2 2 1
Замечание. Обратите внимание на то, что myArray и newArray это ссылки на разные массивы, а не на один и тот же.
Использование спецификатора params
Иногда бывает необходимо создавать метод, в который можно передавать различное количество аргументов. Язык С# предоставляет такую возможность. Для этого параметр метода помечается спецификатором params, размещается в списке параметров последним и является массивом требуемого типа неопределенной длины. Следует отметить, что в методе может быть только один параметр помеченный спецификатором params.
Рассмотрим следующий пример:
class Program
{
static int F(params int[] a)
{
int s = 0;
foreach (int x in a)
{
s += x;
}
return s;
}
static void Main()
{
int a = 1, b = 2, c = 3, d = 4;
Console.WriteLine(F());
Console.WriteLine(F(a));
Console.WriteLine(F(a, b));
Console.WriteLine(F(a, b, c));
Console.WriteLine(F(a, b, c, d));
}
}
|
Результат работы программы:
Недостаточно аргументов
0
1
3
6
10
Как видим, в метод F может быть передано различное количество аргументов, в том числе, и нулевое.
Рассмотрим следующий пример:
class Program
{
static void F(int a, out int s, params int[] b)
{
s = 0;
if (b.Length != 0) //1
{
foreach (int x in b)
{
if (x == a)
{
s += x;
}
}
}
}
static void Main()
{
int a = 1;
int[] x = { 0, 1, 2, 1, 0 };
int z;
F(a, out z, x);
Console.WriteLine(z);
int[] y = { };
F(a, out z, y);
Console.WriteLine(z);
}
}
|
Результат работы программы:
Недостаточно аргументов
2
0
В данном случае, в метод F должно быть передано три параметра: параметр значение а, выходной параметр s и непустой массив b. Если мы попытаемся передать меньшее количество параметров, то компилятор выдаст сообщение об ошибке.
|