TOC

This article has been localized into Russian by the community.

Основы:

Параметры функций

В прошлой главе мы взглянули на функции. Мы бегло обсудили параметры, но именно бегло. Такие параметры очень просты и используются прямо, но есть уловки, позволяющие сделать их белее полезными.

Первое, на что мы обратим внимание, это модификаторы out и ref. Программные языки такие, как как C#, различают два параметра вывода результата функции: "по значению" и "по ссылке". В C# текущим является "по значению", что обычно значит, что, когда вы передаете переменную в функцию при ее вызове, то фактически передаете туда копию объекта, а не ссылку на него. Это также означает, что вы можете изменить параметр из функции, не изменяя оригинала объекта, который передаете как параметр.

Ключевыми словами ref и out вы можете изменить характер действия, так что мы передаем ссылку на объект вместо его значения.

Модификатор ref

Рассмотрим следующий пример:

static void Main(string[] args)
{
    int number = 20;
    AddFive(number);
    Console.WriteLine(number);
    Console.ReadKey();
}

static void AddFive(int number)
{
    number = number + 5;
}

Мы создаем переменную целого типа integer, присваиваем ей число 20 и тогда применяем метод AddFive(), который должен прибавить к integer 5. Но прибавит ли? Нет. Значение, которое мы присвоили integer внутри функции, никогда не будет вынесено из функции, потому что в функцию мы передали копию значения переменной вместо того, чтобы передать туда ссылку на него. Это простое объяснение работы компилятора C#, и чаще всего такой результат предпочтителен. Однако, в этом случае мы бы хотели изменить значение переменной внутри нашей функции. Поэтому следует использовать ключевое слово ref:

static void Main(string[] args)
{
    int number = 20;
    AddFive(ref number);
    Console.WriteLine(number);
    Console.ReadKey();
}

static void AddFive(ref int number)
{
    number = number + 5;
}

Как видите, все, что мы сделали, это добавили ref к определению функции в ее вызове. Если вы сейчас запустите программу, то увидите, что значение number изменилось, поскольку мы вернули его функции при ее вызове.

Модификатор out

Модификатор out работает во многом подобно модификатору ref. Они оба обеспечивают передачу параметра по ссылке, а не по значению, но они характерны двумя важными различиями: значение, передаваемое модификатору ref, должно быть инициализировано до вызова метода - это не относится к модификатору out, который вы можете использовать с неинициализированными значениями. С другой стороны, вы не можете выйти из функции, применив параметр out, не присвоив ему значение. Поскольку вы можете как параметр передать значение без его инициализации, то не можете использовать параметр out внутри функции - вы сможете только присвоить ему новое значение.

Применять параметр out или ref, зависит от ситуации, что вы поймете, когда начнете их использовать. Они оба обычно используются в работе, возвращая то или иное значение из функции C#.

Применение модификатора out похоже на использование модификатора ref, описанное выше. Просто поменяйте ref на out. В предыдущем примере не забудьте удалить присваивание значения переменной number в методе и вместо этого декларируйте его в вызове функции.

Модификатор params

Все наши предыдущие функции принимали фиксированное количество параметров. Однако во многих случаях вам может понадобиться функция, которая принимает произвольное число параметров. Это можно сделать, используя в качестве параметров массив или список, как здесь:

static void GreetPersons(string[] names) { }

Однако его вызов может быть грубоватым. Более короткая форма выглядит так:

GreetPersons(new string[] { "John", "Jane", "Tarzan" });

Она приемлема, но может быть разумнее с применением модификатора params:

static void GreetPersons(params string[] names) { }

Ее вызов выглядел бы так:

GreetPersons("John", "Jane", "Tarzan");

Другая выгода при использовании подхода params в том, что вы так же можете передать ему нулевой параметр. Функции с params могут также принимать параметры long и последним ключевым словом params. Кроме того, в функции может использоваться только один параметр, использующий ключевое слово params. Вот последний и более полный пример:

static void Main(string[] args)
{
    GreetPersons(0);
    GreetPersons(25, "John", "Jane", "Tarzan");
    Console.ReadKey();
}

static void GreetPersons(int someUnusedParameter, params string[] names)
{
    foreach(string name in names)
Console.WriteLine("Hello, " + name);
}
This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!