> For the complete documentation index, see [llms.txt](https://vala.gitbook.io/vala/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vala.gitbook.io/vala/advanced-features/manage-params.md).

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

Методы в 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.<br>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://vala.gitbook.io/vala/advanced-features/manage-params.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
