Г. Шилдт - Полный справочник по C# (1160789), страница 41
Текст из файла (страница 41)
Например, при создании объекта t l вызывается конструкторXYCoord (), выполняющий вызов t h i s (0, 0), который преобразуется в вызов конструктора XYCoord (0, 0). Создание объекта t 2 происходит аналогично.Преимущество использования ключевого слова t h i s для вызова перегруженныхконструкторов состоит в том, что можно избежать ненужного дублирования кода.
Впредыдущем примере применение слова t h i s позволило избежать дублирования всеми тремя конструкторами одного и того же кода инициализации членов. Еще однодостоинство этого средства — возможность создавать конструкторы с заданием действующих "по умолчанию" аргументов, которые используются в том случае, когда аргументы конструктора не заданы явным образом. Например, вы могли бы создать ещеодин конструктор класса XYCoord следующим образом:1 p u b l i c XYCoord(int x) : t h i s ( х , х) { }Этот конструктор автоматически устанавливает координату у равной значению координаты х.
Конечно, использовать такие действующие "по умолчанию" аргументынужно очень аккуратно, поскольку их неправильное использование может ввестипользователей в заблуждение.Метод Main ()До сих пор мы использовали только одну форму метода Main (). Однако существует несколько перегруженных форм этого метода. Одни возвращают значение, а другиепринимают аргументы. Рассмотрением этих форм мы и займемся в следующих разделах.Возвращение значений изметода Main ()По завершении программы можно возвратить значение вызывающему процессу(часто в его роли выступает операционная система). Для этого используется следующая форма метода Main ():p u b l i c s t a t i c i n t Main()Обратите внимание на то, что вместо типа void, эта версия метода Main О имеет вкачестве типа возвращаемого значения i n t .Обычно значение, возвращаемое методом Main(), служит индикатором того, какбыла завершена программа (нормально или аварийно).
По соглашению нулевое значение, как правило, подразумевает нормальное завершение. Все же другие значениясоответствуют определенным типам ошибок.Передача аргументов методу Main()Многие программы принимают аргументы командной строки. Аргумент команднойстроки — это информация, которая указывается при запуске программы сразу послеее имени в командной строке.
Эти аргументы затем передаются методу Main (). Дляработы с аргументами командной строки необходимо использовать одну из следующих форм метода Main ():p u b l i c s t a t i c void M a i n ( s t r i n g [ ] args)p u b l i c s t a t i c i n t M a i n ( s t r i n g [ ] args)Глава 8. Подробнее о методах и классах213Первая форма возвращает значение типа void, а вторую можно использовать длявозврата целочисленного значения, как описано в предыдущем разделе. В обоих случаях аргументы командной строки хранятся как строки в string-массиве, передаваемом методу Main ().Следующая программа отображает все аргументы командной строки, с которымиона была вызвана.// Отображение всей информации из командной строки.using System;class CLDemo {public s t a t i c void Main(string[] args) {Console.WriteLine("Командная строка содержит " +args.Length+11аргументов.
") ;Console.WriteLine("Вот они: " ) ;f o r ( i n t i=0; i<args.Length;Console.WriteLine(args[i]);Предположим, мы запустили на выполнение программу CLDemo следующим образом:CLDemo один два три четыре пятьВ этом случае мы увидим такие результаты:Командная строка содержит 5 аргументов.Вот они:одиндватричетырепятьЧтобы "попробовать на вкус" возможности использования аргументов команднойстроки, рассмотрим следующую программу. Она кодирует и декодирует сообщения.Сообщение, предназначенное для кодирования или декодирования, указывается в командной строке. Метод шифрования очень прост: чтобы закодировать слово, код каждой его буквы инкрементируется на 1. В результате буква "А" превращается в букву"Б" и т.д.
Чтобы декодировать слово, достаточно код каждой его буквы декрементиовать на 1.// Кодирование и декодирование сообщений.using System;class Cipher {public s t a t i c i n t Main(string[] args) {// Проверка наличия аргументов,if(args.Length < 2) {Console.WriteLine("ИСПОЛЬЗОВАНИЕ: " +"слово1: « з а к о д и р о в а т ь » / « р а с к о д и р о в а т ь » " +" [ с л о в о 2 . . . словоЫ]");r e t u r n 1; // Возврат признака неверного выполнения.}// Если аргументы присутствуют, то первым аргументом214Часть I. Язык С#// должно быть слово "закодировать" или "раскодировать".if(args[0] != "закодировать" & args[O] != "раскодировать") {Console.WriteLine("Первым аргументом должно быть слово " +"\"закодировать\" или \"раскодировать\".");return 1; // Возврат признака неверного выполнения.// Кодируем или декодируем сообщение.for(int n=l; n < args.Length; n++) {for(int i=0; i < args[n].Length;if(args[0]=="закодировать")Console.Write((char) (args[n][i] + 1 ) );elseConsole.Write((char) (args[n][i] - 1) );}Console.Write (" " ) ;Console.WriteLine();return 0;Чтобы использовать эту программу, укажите после ее имени командное слово"закодировать" или "раскодировать", а затем фразу, подлежащую соответствующейоперации.
В предположении, что эта программа называется Cipher, приводим двапримера ее выполнения.D:\Cipher закодировать один двапейо егбD:\Cipher раскодировать пейо егбодин дваВ этой программе есть два интересных момента. Во-первых, обратите внимание нато, как проверяется наличие аргументов командной строки. Это очень важный момент, который можно обобщить. Если работа программы опирается на один или несколько аргументов командной строки, всегда необходимо удостовериться4в том, чтоэти аргументы действительно переданы программе.
Отсутствие такой проверки можетпривести к сбою программы. Кроме того, поскольку первым аргументом команднойстроки должно быть слово "закодировать" или "раскодировать", то, прежде чем выполнять кодирование или раскодирование текста, необходимо убедиться в наличииэтого ключевого слова.Во-вторых, обратите внимание на то, как программа возвращает код своего завершения. Если командная строка не записана должным образом, возвращается значение1, которое свидетельствует о нештатной ситуации и аварийном завершении программы.
Возвращаемое значение, равное 0, — признак нормальной работы программы иблагополучного ее завершения.РекурсияВ С# метод может вызвать сам себя. Этот процесс называется рекурсией, а метод,который вызывает себя, называют рекурсивным. В общем случае рекурсия — это процесс определения чего-либо с использованием самого себя. Ключевым компонентомГлава 8. Подробнее о методах и классах-215рекурсивного метода является обязательное включение им инструкции обращения ксамоме себе.
Рекурсия — это мощный механизм управления.Классическим примером рекурсии является вычисление факториала числа. Факториал числа N представляет собой произведение целых чисел от 1 до N Например,факториал числа 3 равен 1x2x3, или 6. Рекурсивный способ вычисления факториалачисла демонстрируется в следующей программе. Для сравнения сюда же включен иего нерекурсивный эквивалент.// Простой пример рекурсии.using System;class Factorial {// Это рекурсивный метод,public int factR(int n) {int result;if(n==l) return 1;result = factR(n-l) * n;return result;// А это его итеративный эквивалент,public int factl(int n) {int t/ result;result = 1;for(t=l; t <= n; t++) result *= t;return result;class Recursion {public static void Main() {Factorial f = new Factorial();Console.WriteLine("Факториалы, вычисленные с " +"использованием рекурсивного метода.");Console.WriteLine("Факториал числа 3 равен " +f.factR(3));Console.WriteLine("Факториал числа 4 равен " +f,factR(4));Console.WriteLine("Факториал числа 5 равен " +f.factR(5));Console.WriteLine() ;Console.WriteLine("Факториалы, вычисленные с " +"использованием итеративного метода.");Console.WriteLine("Факториал числа 3 равен " +f.factl(3));Console.WriteLine("Факториал числа 4 равен " +f.factl(4));Console.WriteLine("Факториал числа 5 равен " +f.factl (5));216Часть I.
Язык С#Вот результаты выполнения этой программы:Факториалы, вычисленныеФакториал числа 3 равенФакториал числа 4 равенФакториал числа 5 равенс использованием рекурсивного метода.б24120Факториалы, вычисленныеФакториал числа 3 равенФакториал числа 4 равенФакториал числа 5 равенс использованием итеративного метода.б24120Нерекурсивный метод f a c t l О довольно прост. В нем используется цикл, в котором организовано перемножение последовательных чисел, начиная с 1 (поэтому начальное значение управляющей переменной равно 1) и заканчивая числом, заданнымв качестве параметра метода.Рекурсивный метод f actR () несколько сложнее.
Если он вызывается с аргументом, равным 1, то сразу возвращает значение 1. В противном случае он возвращаетпроизведение f a c t R ( n - l ) * п. Для вычисления этого выражения вызывается методf actR () с аргументом п - 1 . Этот процесс повторяется до тех пор, пока аргумент нестанет равным 1, после чего вызванные ранее методы начнут возвращать значения.Например, при вычислении факториала числа 2 первое обращение к методу f actR ()приведет ко второму обращению к тому же методу, но с аргументом, равным 1.