# Управление параметрами

Методы в Vala принимают нуль и больше аргументов. Стандартное поведение при вызове метода следующее:

Все параметры с типами значениями копируются в локальные переменные.

Все параметры со ссылочными типами не копируются, вместо этого методу передается просто ссылки на них.

Это поведение можно изменить с помощью модификаторов `ref` и `out`.

**out со стороны вызывающего кода**

вы можете передать методу не инициализированную переменную и можете ожидать, что она будет инициализирована после завершения работы метода

**out со стороны вызываемого кода**

параметр является не инициализированным, вам нужно его инициализировать

**ref со стороны вызывающего кода**

передаваемая методу переменная должна быть инициализирована и значение может быть изменено внутри метода.

**ref со стороны вызываемого кода**

переданный параметр инициализирован и вы можете при желании изменить его значение

```csharp
void method_1(int a, out int b, ref int c) { ... }
void method_2(Object o, out Object p, ref Object q) { ... }
```

Эти методы можно вызывать следующим образом:

```csharp
int a = 1;
int b;
int c = 3;
method_1(a, out b, ref c);

Object o = new Object();
Object p;
Object q = new Object();
method_2(o, out p, ref q);
```

Обращение к переменным будет следующим:

* "а" имеет тип значение. Его значение будет скопировано в другое место в локальной памяти метода, поэтому любые изменения внутри метода не затронут исходное значение после завершения выполнения метода.
* "b" так же имеет тип значение. Однако передан как out параметр. В данном случае значение не копируется, вместо этого методу передается указатель на переменную, так что любые изменения значения переменной внутри метода будут видны вызывающему коду.
* "с" будет вести себя точно так же, как и "b" единственное отличие в другом виде записи.
* "о" имеет ссылочный тип. Методу передается ссылка на исходный объект, поэтому метод может его изменить. Однако если внутри метода переменной присвоить ссылку на другой объект, вызывающему коду новая ссылка видна не будет.
* "р" имеет такой же тип, но он передается как out параметр. Это значит, что методу передается указатель на ссылку, поэтому он может заменить ссылку другой ссылкой на другой объект, и после завершения метода присвоенная внутри метода новая ссылка сохранится. Когда вы используете аргумент данного типа, если вы не присваиваете новую ссылку параметру, то его значение будет установлено на null.
* "q" снова того же типа. В данном случае он обрабатывается сходным с "р" образом с одним важным отличием, т.к. метод может либо не изменять ссылку внутри него и может получить доступ к объекту, на который он указывает. Vala будет следить за тем, что "q" действительно хранит ссылку на объект, и не хранит null.

Here is an example of how to implement method\_1():

```csharp
void method_1(int a, out int b, ref int c) {
    b = a + c;
    c = 3;
}
```

When setting the value to the out argument "b", Vala will ensure that "b" is not null. So you can safely pass null as the second argument of method\_1() if you are not interested by this value.\
