Учебное пособие (1077022), страница 6
Текст из файла (страница 6)
Но в языке C# также существуетвозможность возвращать из метода несколько значений с помощьюконструкцииyieldreturn.Вэтомпоследовательность значений, которыеслучаемогутметодвозвращаетбыть обработаныввызывающем методе.Пример вызова метода с использованием yield return:Console.Write("\nИспользование yield: ");foreach (string st in YieldExample())Console.Write(st);Пример объявления метода с использованием yield return:/// <summary>/// Значения, возвращаемые с помощью yield воспринимаются какзначения массива/// их можно перебирать с помощью foreach/// </summary>static IEnumerable YieldExample(){yield return "1 ";yield return "2 ";yield return "333";}Следуетотметить,чтоконструкциюyieldreturnприменяютсравнительно редко, так как существует возможность вернуть из методаколлекцию.3.7 XML-комментарииПри объявлении классов, методов и других структур возможно задатькомментарии к ним в виде XML-тэгов.Такие комментарии сохраняются в откомпилированной сборке ииспользуются Visual Studio для работы технологии дополнения кодаIntelliSense.Пример метода с XML-комментариями:42/// <summary>/// Метод сложения двух целых чисел/// </summary>/// <param name="p1">Первое число</param>/// <param name="p2">Второе число</param>/// <returns>Результат сложения</returns>static int Sum(int p1, int p2){return p1 + p2;}Перед XML-комментарием ставится три прямых слеша, далееуказывается соответствующий тэг XML.
Существует довольно большоеколичество XML-тэгов комментариев, но наиболее часто используются трииз них: summary – краткое описание; param – описание входного параметра; returns – описание возвращаемого значения.При работе в Visual Studio не нужно вводить полную структуру XMLкомментариев.
Чтобы добавить блок XML-комментариев, необходимоустановить курсор на строку кода перед объявлением функции (класса ит.д.) и три раза набрать прямой слеш «/». После этого автоматическидобавляется заголовок XML-комментария. Visual Studio автоматическиопределяет, для какой структуры добавляется XML-комментарий, игенерирует набор тэгов, подходящих для данного случая.Пример автоматически сгенерированных XML-комментариев для метода:/// <summary>////// </summary>/// <param name="p1"></param>/// <param name="p2"></param>/// <returns></returns>static int Sum(int p1, int p2){return p1 + p2;}Информация о наборе параметров при генерации комментарияформируется автоматически, однако в случае изменения параметров после43добавленияXML-комментарияневозможнаповторнаягенерациякомментария, информация о новых параметрах должна быть добавлена вXML-комментарий вручную.Рис.
6. Использование XML-комментариев при вызове функции Sum.При вызове функции Sum на основе XML-комментариев будетавтоматически сгенерирована подсказка, которая выводится с помощьюIntelliSense (рис. 6).Использованиемеханизмаразработчику создаватьхорошоXML-комментариевдокументируемыйкод,позволяетприэтомдокументация автоматически используется механизмом IntelliSense привызове кода.
Поэтому использование XML-комментариев чрезвычайножелательно при разработке проектов.3.8 Директивы препроцессораВ языке C# как и в C++ существуют директивы препроцессора, однакоони применяются существенно реже чем в С++.В языке C# можно использовать директивы #define и #undef дляопределения и удаления символа, #if, #elif, #else, #endif – для организацииусловий, #warning и #error – для организации выдачи предупреждений иошибок во время компиляции.Примеры использования перечисленных директив:#define debug44#if debug#warning "Это предупреждение выдается в режиме debug"#elif release#error "Эта ошибка выдается в режиме release"#else#error "Должны быть включены debug или release"#endif#undef debugДирективы #region и #endregion задают блок кода, который в VisualStudio может быть свернут или развернут.Пример использования директив #region и #endregion:#region Блок кодаint int1 = 10;#endregionРезультат работы директивы region в развернутом и свернутом видепоказан на рис.
7.Рис. 7. Результат работы директивы region в развернутом и свернутом виде.3.9 Консольный ввод-вывод с преобразованием типовданныхВ качестве обобщающего примера приведен пример 2 программы,реализующей консольный ввод-вывод с преобразованием типов данных. ВнемсодержатсяуправляющиеконструкцииязыкаC#(условные45операторы,обработкаисключений,вызовметодов),атакжепреобразование типов данных при консольном вводе-выводе.
Кроме того,в примере 2 содержатся подробные комментарии.usingusingusingusingSystem;System.Collections.Generic;System.Linq;System.Text;namespace ConsoleInputOutput{class Program{static void Main(string[] args){double d;Console.Write("Введите число: ");string str = Console.ReadLine();//Преобразование строки в число - вариант 1Console.WriteLine("Преобразование строки в число 1");bool ConvertResult = double.TryParse(str, out d);if (ConvertResult){Console.WriteLine("Вы ввели число " + d.ToString("F5"));}else{Console.WriteLine("Вы ввели не число");}//Преобразование строки в число - вариант 2Console.WriteLine("Преобразование строки в число 2");try{d = double.Parse(str);Console.WriteLine("Вы ввели число " + d.ToString("F5"));}catch (Exception e){Console.WriteLine("Вы ввели не число: " + e.Message);Console.WriteLine("\nПодробное описание ошибки: " + e.StackTrace);}//Преобразование строки в число - вариант 3Console.WriteLine("Преобразование строки в число 3");try{d = Convert.ToDouble(str);Console.WriteLine("Вы ввели число " + d.ToString("F5"));}catch (Exception e){Console.WriteLine("Вы ввели не число: " + e.Message);Console.WriteLine("\nПодробное описание ошибки: " + e.StackTrace);}46//Вывод параметров командной строкиCommandLineArgs(args);double a = ReadDouble("Введите коэффициент: ");Console.WriteLine("Вы ввели коэффициент = " + a);Console.ReadLine();}/// <summary>/// Вывод параметров командной строки/// </summary>static void CommandLineArgs(string[] args){//Вывод параметров командной строки - вариант 1Console.WriteLine("\nВывод параметров командной строки 1:");for (int i = 0; i < args.Length; i++){Console.WriteLine("Параметр [{0}] = {1}", i, args[i]);}//Вывод параметров командной строки - вариант 2Console.WriteLine("\nВывод параметров командной строки 2:");int i2 = 0;foreach (string param in args){Console.WriteLine("Параметр [{0:F5}] = {1}", i2, param);i2++;}}/// <summary>/// Ввод вещественного числа с проверкой корректности ввода/// </summary>/// <param name="message">Подсказка при вводе</param>static double ReadDouble(string message){string resultString;double resultDouble;bool flag;do{Console.Write(message);resultString = Console.ReadLine();//Первый способ преобразования строки в числоflag = double.TryParse(resultString, out resultDouble);//Второй способ преобразования строки в число/*try{resultDouble = double.Parse(resultString);//resultDouble = Convert.ToDouble(resultString);flag = true;}catch{//Необходимо присвоить значение по умолчанию47resultDouble = 0;flag = false;}*/if (!flag){Console.WriteLine("Необходимо ввести вещественное число");}}while (!flag);return resultDouble;}}}В этом примере следует обратить внимание на функцию ReadDouble,осуществляющую ввод строки с клавиатуры.
Также она пытаетсяпреобразовать строку в вещественное число. Если это невозможно, тострока вводится повторно до тех пор, пока преобразование строки в числоне пройдет успешно.3.10 Контрольные вопросы к разделу 31. Что такое CTS?2. Что такое типы-значения?3. Что такое ссылочные типы?4. Какие целочисленные типы данных существуют в языке C#?5. Какие типы данных с плавающей точкой есть в языке C#?6.
Какие символьные и строковые типы данных существуют вязыке C#?7. Что такое тип object?8. Какими способами можно преобразовать значение строковоготипа в значение числового типа?9. Как объявляются одномерные массивы в языке C#?10.Как объявляются прямоугольные и зубчатые многомерныемассивы в языке C#? В чем разница между ними?4811.Какие средства консольного ввода-вывода существуют в языкеC#?12.Как работает форматированный вывод в консоль?13.Что такое пространства имен и сборки, как они соотносятсядруг с другом?14.Как задаются и обрабатываются аргументы командной строки вконсольном приложении?15.Какие условные операторы существуют в языке C#?16.Как реализованы операторы сопоставления с образцом в языкеC#?17.Какие операторы цикла существуют в языке C#?18.Как работает цикл foreach?19.Как работает механизм обработки исключений в языке C#?20.В чем особенность порядка расположения блоков catch воператоре обработки исключений?21.Как работают ref-параметры в языке C#?22.Как работают out-параметры в языке C#?23.Как передать в метод переменное количество параметров?24.В чем разница между операторами return и yield return?25.Как применяются XML-комментарии в языке C#?26.Как используются директивы препроцессора в языке C#?4 Основы объектно-ориентированногопрограммирования в C#Если языки C++ и Java довольно схожи в плане синтаксиса основныхконструкций, то в плане объектно-ориентированного программирования(ООП) они довольно сильно различаются.49Подход к ООП в языке C# в целом намного ближе к Java чем к C++.Как и в Java в языке C# нет множественного наследования классов, онореализуется с помощью интерфейсов.Разберем основы ООП в языке C# на основе фрагментов примера 3,которые рассматриваются далее в этом разделе.4.1 Объявление класса и его элементовКлассы в языке С# объявляются с использованием ключевого словаclass.Рассмотрим более детально базовый класс примера – BaseClass:/// <summary>/// Базовый класс/// </summary>class BaseClass{private int i;//Конструкторpublic BaseClass(int param) { this.i = param; }//Методы с различными сигнатурамиpublic int MethodReturn(int a) { return i; }public string MethodReturn(string a) { return i.ToString(); }//Свойство//private-значение, которое хранит данные для свойстваprivate int _property1 = 0;//объявление свойстваpublic int property1{//возвращаемое значениеget { return _property1; }//установка значения, value - ключевое словоset { _property1 = value; }//private set { _property1 = value; }}/// <summary>/// Вычисляемое свойство/// </summary>public int property1mul2{get { return property1 * 2; }}50//Автоматически реализуемые свойства//поддерживающая переменная создается автоматическиpublic string property2 { get; set; }public float property3 { get; private set; }}4.1.1 Объявление конструктораКласс содержит конструктор:public BaseClass(int param) { this.i = param; }Имя конструктора совпадает с именем класса.
Конструктор принимаетодин параметр и присваивает его переменной класса, доступ к которойвыполняется с помощью ключевого слова this. Если конструктор неопределен в классе явно, то считается, что у него есть пустой конструкторбез параметров.4.1.2 Объявление методовТакже класс содержит методы с одинаковыми именами, норазличными сигнатурами, что допустимо в языке C#:public int MethodReturn(int a) { return i; }public string MethodReturn(string a) { return i.ToString(); }Как и в Java, в языке С# модификаторы видимости указываются передкаждым элементом класса, в языке С++ они задаются в виде секций сдвоеточием, например «public:».В языке С# используются следующие модификаторы видимости: public – элемент виден и в классе и снаружи класса; private – элемент виден только в классе; protected – элемент виден только в классе и наследуемыхклассах; internal – элемент виден в текущей сборке; protected internal – элемент виден в наследуемых классахтекущей сборки.514.1.3 Объявление свойствВажные понятие языка С# – свойства.














