- •2. ЯЗЫК C# – ОБЩИЕ КОНЦЕПЦИИ СИНТАКСИСА
- •4. ПРЕОБРАЗОВАНИЯ ТИПОВ
- •6. ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ, ПОЛЕЙ И КОНСТАНТ
- •10. МАССИВЫ В C#
- •11. РАБОТА С СИМВОЛАМИ И СТРОКАМИ В C#
- •13. СВОЙСТВА И ИНДЕКСАТОРЫ
- •14. КОНСТРУКТОРЫ КЛАССА И ЖИЗНЕННЫЙ ЦИКЛ ОБЪЕКТА
- •16. ПЕРЕГРУЗКА ОПЕРАЦИЙ
- •18. СОБЫТИЯ
- •19. ИНТЕРФЕЙСЫ
- •22. ГЕНЕРАЦИЯ И ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
//а можем вообще ничего не передавать
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
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