Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект Лекций Волосевич, А. А. Язык_С#_и_платформа_NET_.pdf
Скачиваний:
38
Добавлен:
26.03.2016
Размер:
1.42 Mб
Скачать

//а можем вообще ничего не передавать

PrintList();

При вызове методов на месте формальных параметров помещаются фактические, совпадающие с формальными по типу или приводимые к этому типу. Если при описании параметра использовались модификаторы ref или out, то они должны быть указаны и при вызове. Кроме этого, фактические параметры с такими модификаторами должны быть представлены переменными, а не литералами или выражениями.

Значение, возвращаемое методом-функцией, может использоваться в вы-

ражениях, а может быть проигнорировано:

SayInt(); //хотя это функция, результат ее работы игнорируетсяР

C# позволяет использовать перегрузку методов в пользовательских типах. Перегруженные методы имеют одинаковое имя, но разную сигнатуру. Сигна-

тура – это набор из модификаторов и типов списка формальных параметров. В

языке C# считается, что сигнатура включает модификаторы refИи out, но не

включает модификатор params:

 

Б

У

 

 

 

//Данный код не компилируется – методы Foo различить нельзя!

void Foo(params int[] a) {. . .}

Г

void Foo(int[] a) {. . .}

к

 

 

 

 

 

 

//Следующий фрагмент кода корре тен

 

 

 

е

 

 

void Foo(out int a) {. . .}

а

 

void Foo(ref int a) {. . .}

 

Тип метода также не

является

 

 

 

частью сигнатуры. Специальных ключевых

слов для определения перегруженных м тодов указывать не требуется. При вы-

 

о

 

зове одного из перегруженных ме одов компилятор выбирает подходящий ме-

тод по сигнатуре.

 

 

л

10. МАССИВЫ В C#

 

 

Объявление масс ва в языке C# схоже с объявлением переменной, но по-

б

 

пара квадратных скобок – признак массива:

сле указания типа размещаетсяи

intи[] Data;

Масс в является ссылочным типом, поэтому перед началом работы любой массБв должен быть создан в памяти. Для этого используется ключевое слово new, после которого указывается тип массива и в квадратных скобках – количество элементов массива.

int[] Data;

Data = new int[10];

Созданный массив автоматически заполняется значениями по умолчанию своего базового типа. Создание массива можно совместить с его объявлением:

int[] Data = new int[10];

24

Для доступа к элементу массива указывается имя массива и индекс в квадратных скобках: Data[0] = 10.

Элементы массива нумеруются с нуля, в C# не предусмотрено синтаксических конструкций для указания особого значения нижней границы массива.

В языке C# существует способ инициализации массива значениями при создании. Для этого используется список элементов в фигурных скобках. Инициализация может быть выполнена в развернутой и короткой форме, которые эквивалентны:

int[] Data = new int[10] {1, 2, 3, 5, 7, 11, 13, 17, 19, 23}; int[] Data = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23};

Если инициализация выполняется в развернутой форме, то количество элементов в фигурных скобках должно быть равно числу, указанному в квад-

ратных скобках.

 

 

 

 

 

У

Р

При необходимости можно объявить массивы, имеющие несколько раз-

мерностей. Для этого в квадратных скобках после типа массиваИпомещают за-

пятые, «разделяющие» размерности:

 

 

Б

 

 

// объявлен двумерный массив D

 

 

 

 

Г

 

int[,] D;

 

 

 

 

 

// создаем массив D так:

 

 

 

 

 

D = new int[10,2];

к

 

 

 

 

 

 

 

 

 

// объявим трехмерный Cube и созд дим его

 

 

 

 

 

е

 

 

 

 

int[,,] Cube = new int[3,2,5];а

 

 

// установим элемент массива Cube:

 

 

 

Cube[1,1,0] = 1000;

 

 

 

 

 

 

 

 

о

};

 

 

 

 

 

// объявим маленький двумерный массив и инициализируем его

int[,] C = new int[2,4] {

2,

3,

4},

 

 

 

 

 

{1,

 

 

 

л

т{10, 20, 30, 40}

 

 

 

 

 

 

 

 

 

 

б

 

 

 

 

 

 

 

// то же самоеи, немного короче:

 

 

 

 

int[,] C = {{1, 2, 3, 4}, {10, 20, 30, 40}};

 

и

 

 

 

 

 

 

 

 

В пр веденных примерах объявлялись массивы из нескольких размерностей. Так е массивы всегда являются прямоугольными. Можно объявить массив масс вов, используя следующий синтаксис:

int[][]

Table;

 

// Table –

массив

одномерных массивов

Table =

new int[3][];

// в Table

будет 3 одномерных массива

БTable[0] = new

int[2];

// в первом будет

2 элемента

Table[1] =

new

int[20];

//

во втором

20

элементов

Table[2] =

new

int[12];

//

в третьем

12

элементов

//а вот так мы работаем с элементами массива Table: Table[1][3] = 1000;

//совместим объявление и инициализацию массива массивов int[][] T = {

25

}
}
Console.WriteLine("Отсортированный массив:"); foreach(int i in M) Console.Write("{0,6}", i);

new int[2] {10, 20}, new int[3] {1, 2, 3} };

При работе с массивами можно использовать цикл foreach, перебирающий все элементы. В следующем фрагменте производится суммирование элементов массива Data:

int[] Data = {1,3,5,7,9}; int Sum = 0;

foreach(int element in Data)

Вцикле foreach возможно перемещение по массиву в одном направленииР

от начала к концу, при этом попытки присвоить значение элементуИмассива игнорируются.

Вкачестве примера работы с массивами рассмотримУпрограмму, выполняющую сортировку массива целых чисел. Гpublic static void Main() Б

{

 

 

 

 

а

 

 

Console.Write("Введите число элементов: ");

 

 

int Size = Int32.Parse(Console.ReadLine());

 

 

int[] M = new int[Size];

 

 

for (int i = 0; i <

кSize; i++) {

 

 

 

 

т

 

 

 

 

Console.Write("Вв дите {0} элемент массива: ", i);

 

 

}

M[i] = Int32.Parse(Console.ReadLine());е

 

 

 

 

 

 

 

Console.WriteLine("Исходный массив:");

 

 

foreach(int i in M) Console.Write("{0,6}", i);

 

 

л

 

 

 

 

Console.WriteLine();о

 

б

 

 

 

 

 

for(intиi = 0; i < Size-1; i++)

и

 

for(int j = i+1; j < Size; j++) {

 

 

if (M[i] > M[j]) {

 

 

 

 

Б

 

 

 

int dop = M[i];

M[i] = M[j];

M[j] = dop;

}

}

26

Все массивы в .NET Framework могут рассматриваться как классы, являющиеся потомками класса System.Array. В табл. 3 описаны основные методы и свойства класса System.Array.

 

 

 

 

Элементы класса System.Array

 

 

Таблица 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Имя элемента

 

 

 

 

 

Описание

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

2

 

 

 

 

Rank

 

 

 

Свойство только для чтения, возвращает размерность массива

Length

 

 

 

Свойство только для чтения, возвращает число элементов массива

GetLength()

 

 

Метод возвращает число элементов в указанном измерении

 

1

 

 

 

 

 

 

 

2

 

 

 

И

GetLowerBound()

 

Метод возвращает нижнюю границу для указанного измерения

GetUpperBound()

 

 

 

 

 

 

 

 

У

 

Метод возвращает верхнюю границу для указанного измеренияР

 

 

 

 

 

 

 

 

 

 

 

 

 

Окончание табл. 3

GetValue()

 

 

 

 

 

 

 

 

Г

 

 

 

Метод возвращает значение элемента с указанными индексами

SetValue()

 

 

Метод устанавливает значение

Б

 

указанными индексами

 

 

элемента с

 

 

 

 

(значение – первый аргумент)

 

 

 

 

 

Sort()

 

 

 

 

 

 

 

элемента

 

 

 

 

 

 

 

Статический метод, который сортирует массив, переданный в качест-

 

 

 

 

ве параметра. Тип элемента м ссива должен реализовывать интерфейс

 

 

 

 

IComparable

к

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BinarySearch()

 

Статический метод поис

 

в отсортированном массиве. Тип

 

 

 

 

 

 

е

 

 

 

 

 

 

 

 

 

 

элемента массива долж н реализовывать интерфейс IComparable

IndexOf()

 

 

Статический м тод, возвращает индекс первого вхождения своего ар-

 

 

 

 

 

асти

 

 

 

 

 

 

 

 

 

 

 

гумента в одном рный массив или –1, если элемента в массиве нет

LastIndexOf()

 

Статический ме од. Возвращает индекс последнего вхождения своего

 

 

 

 

его

 

 

 

 

 

 

 

 

 

 

 

 

аргумен а в одномерный массив или –1, если элемента в массиве нет

Reverse()

 

 

Статический ме од, меняет порядок элементов в одномерном массиве

 

 

 

 

или

 

на противоположный

 

 

 

 

 

 

 

 

ч

 

 

 

 

 

Copy()

 

 

 

Стат ческий метод. Копирует раздел одного массива в другой массив,

 

 

л

 

 

 

 

 

 

 

 

 

 

 

 

 

выполняя приведение типов

 

 

 

 

 

Clear()

б

 

Стат ческий метод. Устанавливает для диапазона элементов массива

 

 

значение по умолчанию для типов элементов

 

 

 

 

 

 

 

 

В примерахвыводимые данные записаны как комментарии. Вначале – исполь-

CreateInstance()

Статический метод. Динамически создает экземпляр массива любого

 

 

 

 

типа, размерности и длины

 

 

 

 

 

Теперь рассмотрим примеры использования описанных методов и свойств.

зование нескольких простых элементов System.Array:

 

 

 

Бint[,] M = {{1, 3, 5}, {10, 20, 30}};

 

 

 

// 2

Console.WriteLine(M.Rank);

 

 

 

 

 

 

Console.WriteLine(M.Length);

 

 

 

 

 

// 6

Console.WriteLine(M.GetLowerBound(0));

 

 

 

// 0

Console.WriteLine(M.GetUpperBound(1));

 

 

 

// 2

Продемонстрируем сортировку и поиск в одномерном массиве:

27