Метод Main () и другие методы (C# и Java)
Обновлен: Ноябрь 2007
В этом разделе описаны методы и способы передачи параметров методов путем ссылки и значения.
Метод Main ()
В каждом приложении на C# должен присутствовать один метод Main, указывающий точку начала выполнения программы. В языке C# Main пишется с прописной буквы, в то время как в языке Java используется нижний регистр main.
Main может возвращать только int или void, и имеет необязательный аргумент массива строк для представления параметров командной строки:
static int Main(string[] args)
{
//...
return 0;
}
Параметр массива строк, содержащий любые переданные аргументы командной строки, работает так же как в языке Java. Таким образом, args[0] указывает первый параметр командной строки, args[1] определяет второй параметр и так далее. В отличие от C++, массив args не содержит имя EXE-файла.
Другие методы
Параметры можно подставлять в метод в виде значения или путем ссылки. Параметры значений просто принимают значение любой переменной для использования в методе. Таким образом, значение переменной в вызывающем коде не зависит от действий, выполняемых с параметрами в методе.
Однако, ссылочные параметры указывают на переменную, объявленную в вызывающем коде, и, следовательно, методы изменят содержимое этой переменной при передаче путем ссылки.
Передача по ссылке
Как в языке Java, так и в языке C#, параметры методов, ссылающиеся на объект, всегда передаются по ссылке, тогда как параметры типа примитивных данных (типы значений в C#) передаются по значению.
В C# для передачи типа значения по ссылке необходимо указать одно из ключевых слов ref или out. Разница между этими двумя ключевыми словами заключается в инициализации параметров. Параметр ref должен быть инициализирован перед использованием, в то время как параметр out не требует явной инициализации перед передачей и любое предыдущее значение пропускается.
Ключевое слово ref
Это ключевое слово указывается в параметре типа значения, если необходимо, чтобы вызванный метод окончательно изменил значение переменных, используемых в качестве параметров. Таким образом, вместо передачи значения переменной, используемой в вызове, передается ссылка на саму переменную. Затем метод использует ссылку, так что изменения параметра во время выполнения метода сохраняются в начальной переменной, используемой в качестве параметра метода.
В следующем коде это продемонстрировано в методе Add, в котором второй параметр int передается по ссылке с ключевым словом ref:
class TestRef
{
private static void Add(int i, ref int result)
{
result += i;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(10, ref total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
Результат этого простого примера показывает, что изменения параметра результата отражаются в переменной total, используемой в вызове метода Add:
Original value of 'total': 20
Value after calling Add(): 30
Это происходит потому, что параметр результата ссылается на фактическое место в памяти, занятое всей переменной в вызывающем коде. Свойство класса не является переменной и не может использоваться непосредственно как параметр ref.
Ключевое слово ref должен предшествовать параметру при вызове метода, а также в объявлении метода.
Ключевое слово out
Действие ключевого слова out аналогично действию ключевого слова ref, а изменения параметра, объявленного при помощи out, будут отображаться вне метода. Два отличия от ref заключаются в том, что любое начальное значение параметра out пропускается в методе, и параметр out должен быть присвоен во время метода:
class TestOut
{
private static void Add(int i, int j, out int result)
{
// The following line would cause a compile error:
// System.Console.WriteLine("Initial value inside method: {0}", result);
result = i + j;
return;
}
static void Main()
{
int total = 20;
System.Console.WriteLine("Original value of 'total': {0}", total);
Add(33, 77, out total);
System.Console.WriteLine("Value after calling Add(): {0}", total);
}
}
В этом случае, третий параметр метода Add объявляется с ключевым словом out, а для вызова метода также требуется ключевое слово out для этого параметра. Результат будет следующим.
Original value of 'total': 20
Value after calling Add(): 110
Итак, подытожим. Ключевое слово ref используется тогда, когда необходимо, чтобы метод изменял существующую переменную, а ключевое слово out – для возврата значения, получаемого внутри метода. Оно используется, главным образом, вместе с возвращаемым значением метода, когда метод создает более одного значения результата для вызывающего кода.
См. также
Основные понятия
Руководство по программированию в C#
Main() и аргументы командной строки (Руководство по программированию в C#)
Ссылки
Передача параметров (Руководство по программированию в C#)