Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по C#.doc
Скачиваний:
327
Добавлен:
08.11.2018
Размер:
5.81 Mб
Скачать
    1. Комментарии

В C# используется два типа комментирования: комментирование блока текста и комментирование строки.

Комментирование блока текста

Чтобы вставить блочный (многострочный комментарий), текст комментария обрамляется символами: /* комментарий */, например:

/* Эта переменная хранит количество элементов */

int count;

Комментирование строки текста

Чтобы закомментировать строку текста (всю или часть) необходимо перед началом комментария поставить символы //, например:

Int count; // Эта переменная хранит количество элементов

Внимание. На панели инструментов существуют кнопки: – комментирование выделенного фрагмента и – раскомментирование выделенного фрагмента.

    1. Массивы

В C# имеется три основных типа массивов: одномерные, многомерные и неровные(jagged):

  • С одномерными массивами все как обычно:

Декларация.

тип[] имя_массива = new тип[длина]

Пример:

int[] A = new int[10];

int[] A = {1, 2, 3, 4, 5};

Доступ. Доступ к элементам производится по номеру элемента (индексу):

Имя_массива[№ элемента]

Пример:

int[] A = new int[10];

A[4]=3;

int x=A[4]*2+1;

Внимание. Элементы нумеруются индексами от 0 до N - 1, где N - размер массива.

  • Многомерные массивы представляют собой многомерные кубы значений. Элементы таких массивов идентифицируются набором индексов - "координат" в многомерном пространстве. Каждое измерение имеет свою размерность, не зависящую от других.

Декларация. При декларации массива размерности его измерений указываются через запятую:

тип[] имя_массива = new тип[длина1,длина2]

Пример:

int[,] А = new int[10, 20];

int[,] В = {{1, 2}, {3, 4}};

Доступ. Доступ к элементам производится с помощью оператора [], в котором индексы также указываются через запятую:

Имя_массива[№строки, №столбца]

Пример:

int[,] A = new int[10,14];

A[3,4]=3;

int x=A[3,4]*2+1;

Внимание. Элементы нумеруются наборами индексов, каждый из которых может принимать значение от 0 до N - 1, где N - размер соответствующего измерения массива.

  • Неровные (jagged) массивы - это, по сути, массивы массивов.

Декларация. При декларации неровного массива одна из его размерностей является константой, другая оставляется пустой:

тип имя_массива[][] = new тип[длина1][]

или

тип имя_массива[][] = new тип[][длина2]

Пример:

int А[][] = new int[2][];

А[0] = new int[4];

А[1] = new int[20];

Доступ. Доступ к элементам производится с помощью операторов [], прописываемых подряд для каждого измерения со своим индексом без запятых:

Имя_массива[№строки][№столбца]

Пример:

int element = array[0][1];

Внимание. Неровные массивы похожи на многомерные, но их размеры могут различаться даже в одном измерении. В приведенном примере существует элемент А[1][15], но не существует элемента А[0][15].

    1. Исключения

Исключения служат для обработки ошибок. Исключения были придуманы больше 15 лет назад, стандартный синтаксис исключений берет свое начало от C++.

Допустим, в некотором методе случается ошибка. Что делать? Можно, конечно, прервать процесс без объяснений, но это не является корректным решением, т.к. метод, в котором возникла ошибка, ничего не знает об окружении, в котором он выполняется и, стало быть, не вполне компетентен в выборе стратегии в нештатной ситуации. Правильным решением является выдача сообщения вызывающему методу. В языках без поддержки исключений использовались коды ошибок. Метод (функция) завершался, возвращая "особенное" значение, которое трактовалось как ошибочное. Такой подход является очень неудобным в силу сложности передачи всей информации об ошибке в одном числе.

Исключения в этом смысле стали панацеей. Идея очень проста: если в каком-то методе происходит ошибка, то создается объект, описывающий ее, и генерируется исключение на его основе. При генерации исключения прекращается выполнение текущего блока и идет возврат на более высокий уровень. На нем исключение может быть "поймано" и обработано. Если оно не обрабатывается на более высоком уровне, идет переход еще выше и т.д. пока процесс передачи исключения не дойдет до системного вызова, в котором все исключения обрабатываются.

Синтаксис исключения:

try

{

блок команд, в котором может возникнуть ошибка

}

[catch [(тип_исключения имя_исключения)]

{

блок обработки исключения

}]

[finally

{

команды, которые выполняются в любом случае

}]

Схема работы такой конструкции очень проста - если в блоке try происходит исключение, то идет переход на блок catch и ему это исключение передается в качестве параметра. В любом случае (произошло исключение или нет) в конце вызывается блок команд finally.

Создание собственного исключения:

Исключение создается с помощью команды try, которой передается объект типа Exception, который содержит информацию об исключении. Таким образом, в блоке try исключения могут возникнуть двумя способами - непосредственный вызов команды throw или необработанное исключение в одном из вызываемых методов.

Пример:

public static double Calculate(double f )

{

if (d == 0)

throw new Exception("Функция не определена в 0");

return 1 / d;

}

public static void Main()

{

try

{

double d1=Calculate(2);

double d2=Calculate(0);

double d3=Calculate(1);

}

catch (Exception e)

{

label1.Text="Ошибка: "+e;

}

}

}

При различных типах исключения можно производить различные действия. Для этого используется несколько блоков catch подряд. При этом вызывается первый блок, чей тип исключения соответствует типу пришедшего исключения:

try

{

Calculate(х);

}

catch (DivisionByZeroException e)

{

label1.Text="Деление на ноль"+e;

}

catch (OverflowException e)

{

label1.Text="Неверная область определения "+e;

}

catch (Exception e) // Обработка остальных типов исключения

{

label1.Text="Ошибка: "+e;}