- •Лабораторная работа № 1
- •5. Ввод и вывод в консольном приложении
- •6 Классы: основные понятия
- •6.1 Присваивание и сравнение объектов
- •6.2 Данные: поля и константы
- •6.3 Методы
- •5.3.1 Параметры методов
- •6.4 Ключевое слово this
- •6.5 Конструкторы
- •6.6 Свойства
- •7 Классы: подробности
- •7.1 Перегрузка методов
- •7.2 Рекурсивные методы
- •7.3 Методы с переменным количеством аргументов
- •7.4 Метод Main
- •7.5 Индексаторы
- •7.6 Операции класса
- •7.7 Деструкторы
- •7.8 Вложенные типы
- •8 Задания
7.3 Методы с переменным количеством аргументов
Иногда бывает удобно создать метод, в который можно передавать разное количество аргументов. Язык С# предоставляет такую возможность с помощью ключевого слова params. Параметр, помеченный этим ключевым словом, размещается в списке параметров последним и обозначает массив заданного типа неопределенной длины, например:
public int Calculate( int a, out int c, params int[] d ) ...
В этот метод можно передать три и более параметров. Внутри метода к параметрам, начиная с третьего, обращаются как к обычным элементам массива. Количество элементов массива получают с помощью его свойства Length. В качестве примера рассмотрим метод вычисления среднего значения элементов массива (листинг 1.15).
Листинг 1.15 - Метод с переменным числом параметров
using System;
namespace ConsoleApplication1
{ class Class1
{
public static double Average( params int [ ] a )
{
if ( a.Length == 0 )
throw new Exception( "Недостаточно аргументов в методе" );
double av = 0;
foreach ( int elem in a ) av += elem;
return av / a.Length;
}
static void Main()
{ try
{
Int [ ] a = { 10, 20, 30 };
Console.WriteLine( Average( a ) ); // 1
int [ ] b = { -11, -4, 12, 14, 32, -1, 28 };
Console.WriteLine( Average( b ) ): // 2
short z = 1, e = 13:
byte v = 107;
Console.WriteLine( Average( z, e, v ) ); // 3
Console.WriteLine( Average() ); // 4
}
catch( Exception e )
{
Console.WriteLineC e.Message );
return;
}
}
}
}
Результат работы программы:
20
10
38
Недостаточно аргументов в методе
В данном алгоритме отсутствие аргументов при вызове метода Average является ошибкой. Этот случай обрабатывается генерацией исключения. Если не обработать эту ошибку, результат вычисления среднего будет равен «не числу» (NaN) вследст- вие деления на ноль в операторе возврата из метода.
Параметр-массив может быть только один и должен располагаться последним в списке. Соответствующие ему аргументы должны иметь типы, для которых возможно неявное преобразование к типу массива.
7.4 Метод Main
Метод, которому передается управление после запуска программы, должен иметь имя Main и быть статическим. Он может принимать параметры из внешнего окружения ивозвращать значение в вызвавшую среду. Предусматривается два варианта методас параметрами и без параметров:
// без параметров:
static тип Main() { . . . }
static void Main() { . . . }
// с параметрами:
static тип Main( string[ ] args ) { /*. . .*/ }
static void Main( string[ ] args ) { /*. . .*/ }
Параметры, разделяемые пробелами, задаются при запуске программы из командной строки после имени исполняемого файла программы. Они передаются в массив args. Имя параметра в программе может быть любым, но принято использовать имяargs.
Если метод возвращает значение, оно должно быть целого типа, если не возвращает, он должен описываться как void. В этом случае оператор возврата изMain можно опускать, а вызвавшая среда автоматически получит нулевое значение, означающее успешное завершение. Ненулевое значение обычно означает аварийное завершение, например:
static int Main( string[] args )
{
. . .
if ( . . . /* все пропало */ ) return 1;
. . .
if ( . . . /* абсолютно все пропало */ ) return 100;
}
Возвращаемое значение анализируется в командном файле, из которого запускается программа. Обычно это делается для того, чтобы можно было принять решение, выполнять ли командный файл дальше. В листинге 1.16 приводится пример метода Main, который выводит свои аргументы и ожидает нажатия любой клавиши.
Листинг 1.16 - Параметры метода Main
using System;
namespace ConsoleApplication1
{ class Class1
{ static void Main( string[ ] args )
{
foreach( string arg in args ) Console.WriteLine( arg );
Console.Read();
}
}
}
Пусть исполняемый файл программы имеет имя ConsoleApplication1.exe и вызывается из командной строки:
d:\cs\ConsoleApplicationl\bin\Debug\ConsoleApplicationl.exe one two three
Тогда на экран будет выведено:
one
two
three
Если параметр содержит специальные символы или пробелы, его заключают в кавычки.