Учебное пособие (1077022), страница 5
Текст из файла (страница 5)
В круглых скобках послеfor указываются три оператора – начальное присвоение значенияпеременной цикла; условие выхода из цикла; оператор, которыйвыполняется при переходе к следующему шагу цикла. Операторыразделяются точкой с запятой.Пример цикла for:for (int i = 0; i < 3; i++)Console.Write(i);В данном примере оператор вывода переменной i не вложен вфигурные скобки, использование скобок не является обязательным, так какэто единственный оператор цикла.
Если бы в цикле выполнялосьнесколько действий, то их необходимо было бы вложить в фигурныескобки.В языке C# также существует форма счетного цикла, предназначеннаядля перебора коллекции – foreach. В классическом языке С++ такой циклотсутствует (однако он появился в новых версиях). В языке Java этот циклимеет синтаксис for(переменная : коллекция).Пример цикла foreach:int[] array1 = { 1, 2, 3 };35foreach(int i2 in array1)Console.Write(i2);В данном примере int i2 является объявлением переменной цикла, inотделяет переменную цикла от имени коллекции.Следует отметить, что цикл foreach является одним из наиболее частоиспользуемых видов цикла в C#.
Это обусловлено тем, что в языке C#существует развитый набор коллекций, а реализация многих алгоритмовсвязана с перебором коллекций.Циклы с предусловием и постусловием также очень похожи на те, чтов C++ и Java.Пример цикла с предусловием:int i3 = 0;while (i3 < 3){Console.Write(i3);i3++;}Пример цикла с постусловием:int i4 = 0;do{Console.Write(i4);i4++;} while (i4 < 3);3.6.5 Обработка исключенийЕсли потребовалось бы написать на чистом языке С приложение,выполняющее критически важные действия, то оно было бы написано вследующем стиле: выполняется вызов функции, функция возвращает кодвозврата (код ошибки), производится анализ кода возврата с помощьюоператора switch…case, в зависимости от кода возврата выполняютсядейтсвия по обработке ошибок. Не возникает сомнений в том, что такоепрограммирование будет очень трудоемко.36Длярешенияданнойпроблемывсовременныхязыкахпрограммирования (C#, Java, современные версии C++) существуютконструкции обработки исключений.В блоке try записываются операторы, которые могут привести квозникновению ошибок.
Собственно, термин «ошибка» употреблять несовсем корректно – то что в программе на чистом языке С былокритической ошибкой теперь называют «исключением», исключительнойситуацией которая может быть обработана в программе.Если возникает ошибка (исключение) определенного вида, то онаобрабатывается в блоке catch. Все исключения в С# – классы,унаследованные от класса Exception. В скобках после catch указываюткласс исключения и переменную этого класса, из которой можно получитьконкретные сведения о произошедшем исключении.Блоков catch может быть несколько, каждый из них осуществляетперехват исключения определенного вида.
В этом случае срабатываеттолько один, первый по порядку блок catch, поэтому последовательностьобработки исключений очень важна. Необходимо, чтобы первымирасполагались наиболее детальные исключения, те, которые размещаютсяна наиболее детальном уровне в дереве наследования от класса Exception.Если первым в списке поставить наиболее общий класс Exception, толюбое исключение будет приведено к этому типу, и остальные блоки catchникогда не будут выполнены. Такое приведение типов являетсяследствием полиморфизма классов в ООП – дочерний тип (класс) можетбыть приведен к родительскому типу (классу).Необязательный блок finally располагается после блоков catch.Действия в блоке finally выполняются всегда, вне зависимости от тогопроизошло исключение в блоке try или нет.
Если, например, в блоке tryпроисходит работа с файлами, то в блоке finally можно расположить37оператор закрытия файла, который будет закрыт вне зависимости от тогобыли ошибки при работе с файлом или нет.Пример блока обработки исключений:Console.WriteLine("\n\nДеление на 0:");try{int num1 = 1;int num2 = 1;string zero = "0";int.TryParse(zero, out num2);int num3 = num1 / num2;}catch (DivideByZeroException e){Console.WriteLine("Попытка деления на 0");Console.WriteLine(e.Message);}catch (Exception e){Console.WriteLine("Собственное исключение");Console.WriteLine(e.Message);}finally{Console.WriteLine("Это сообщение выводится в блоке finally");}В данном примере сначала обрабатывается детальное исключениеделения на ноль (класс DivideByZeroException), а затем все остальныеисключения, которые приводятся к наиболее общему классу Exception.Кроме стандартных классов исключений, предусмотренных в .NET,разработчик может создавать собственные исключения, унаследованные откласса Exception.
Однако такие исключения не будут вызыватьсяавтоматически, ведь никаких критичных действий вроде деления на нольне происходит. Поэтому разработчик должен искусственно сгенерироватьошибку с помощью команды throw, причем можно генерировать истандартные исключения, существующие в .NET.Пример генерации исключения:Console.WriteLine("\nСобственное исключение:");38try{throw new Exception("!!! Новое исключение !!!");}catch (DivideByZeroException e){Console.WriteLine("Попытка деления на 0");Console.WriteLine(e.Message);}catch (Exception e){Console.WriteLine("Собственное исключение");Console.WriteLine(e.Message);}finally{Console.WriteLine("Это сообщение выводится в блоке finally");}3.6.6 Вызов методов, передача параметров и возвратзначенийВызов методов происходит также как и в языках C++ и Java.
Методвызывается по имени, параметры передаются в круглых скобках после егоимени. При объявлении метода указываются формальные параметры, привызове в них выполняется подстановка фактических параметров, скоторыми метод осуществляет работу при данном вызове.В языке C# есть особенность, связанная с передачей параметров –ключевые слова ref и out.Если перед параметром указывается ключевое слово ref, то значениепередается по ссылке, то есть передается ссылка на параметр. Еслипараметр изменяется в методе, то эти изменения сохраняются ввызывающем методе.
При этом необходимо учитывать, что все значенияссылочных типов (объекты классов) автоматически передаются по ссылкедаже без указания ключевого слова ref, их изменения в методеавтоматически сохраняются. Таким образом, ключевое слово ref актуальнопрежде всего для типов-значений. Оно является аналогом передачи39параметра по указателю в языке С++, хотя в современных вариантах С++также используется понятие ссылки.Если перед параметром указывается ключевое слово out, то значениепараметра обязательно должно быть инициализировано в вызываемомметоде, что проверяется на этапе компиляции.
До передачи в вызываемыйметодзначениепеременнойИнициализированноезначениеможетбытьпараметранеинициализировано.становитсядоступноввызывающем методе.Ключевые слова ref и out должны быть указаны и при объявлениипараметров в методе, и при вызове метода. Их указание при вызове метода,очевидно, излишне для компилятора, которому достаточно информациипри объявлении метода. Однако это позволяет программисту избежатьошибок,связанныхснезапланированнымизменениемзначенийпараметров в методе.Пример вызова методов:string RefTest = «Значение до вызова функций»;ParamByVal(RefTest);Console.WriteLine(«\nВызов функции ParamByVal. Значение переменной:« + RefTest);ParamByRef(ref RefTest);Console.WriteLine(«Вызов функции ParamByRef.
Значение переменной: «+ RefTest);int x = 2, x2, x3;ParamOut(x, out x2, out x3);Console.WriteLine(«Вызов функции ParamOut. X={0}, x^2={1}, x^3={2}»,x, x2, x3);Пример объявления методов:/// <summary>/// Передача параметра по значению/// </summary>static void ParamByVal(string param){param = «Это значение НЕ будет передано в вызывающую функцию»;}40/// <summary>/// Передача параметра по ссылке/// </summary>static void ParamByRef(ref string param){param = «Это значение будет передано в вызывающую функцию»;}/// <summary>/// Выходные параметры объявляются с помощью out/// </summary>static void ParamOut(int x, out int x2, out int x3){x2 = x * x;x3 = x * x * x;}Вверсииусовершенствование,языкаC#которое7реализованопозволяетсинтаксическоеобъявлятьout-параметрынепосредственно при вызове функции.
Ранее для передачи out-параметровиспользовался следующий синтаксис:int i;OutFunction(out i);Теперь можно использовать упрощенную конструкцию:OutFunction(out int i);Использование упрощенной конструкции позволяет существенносократить код при большом количестве out-параметров.В метод может быть передано переменное количество параметров, дляэтого при объявлении параметра метода используется ключевое словоparams.Пример вызова метода с переменным количеством параметров:ParamArray("Вывод параметров: ", 1, 2, 333);Пример объявления метода с переменным количеством параметров:/// <summary>/// Переменное количество параметров задается с помощью params/// </summary>static void ParamArray(string str, params int[] ArrayParams){Console.Write(str);foreach (int i in ArrayParams)Console.Write(" {0} ", i);}41Параметр с ключевым словом params должен быть объявленпоследним в списке параметров.Для возврата значений из методов, так же как и в языках C++ и Java,используется ключевое слово return.














