Метод 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#)

Другие ресурсы

Язык программирования C# для разработчиков на Java