# Методы

Функции в Vala называются методами, независимо от того, объявлены ли они внутри класса или нет. С этого момента мы будем придерживаться термина "метод".

```csharp
int method_name(int arg1, Object arg2) {
return 1;
}
```

Этот фрагмент кода определяет метод с именем `method_name`, принимающий два аргумента: целое число и `Object` (первый передается по значению, второй - по ссылке). Метод возвращает целое число, в данном случае 1.

Методы в Vala являются функциями C, поэтому они могут принимать любое количество аргументов и возвращать одно значение (или ни одного, если метод объявлен как `void`). Методы могут возвращать несколько значений, если вызывающий код знает, где расположены данные. Детали реализации этого смотрите в разделе "Управление параметрами" в "продвинутой" части этого руководства.

В Vala принято давать имена методам в нижнем регистре, используя нижнее подчеркивание для разделения слов: all\_lower\_case. Это может быть непривычно для программистов на C# или Java, которые привыкли к именам вида CamelCase или mixedCamelCase. Но следуя этой рекомендации, вы будете использовать стиль, принятый в C/GObject библиотеках.

В одной области видимости не могут находиться несколько методов с одинаковым именем и разными сигнатурами (перегрузка методов):

```csharp
void draw(string text) { }
void draw(Shape shape) { } // невозможно
```

Это связано с тем, что библиотеки, написанные на Vala используются также С-программистами. В Vala вы должны написать например так:

```csharp
void draw_text(string text) { }
void draw_shape(Shape shape) { }
```

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

```csharp
void f(int x, string s, double z) { }
void f(int x, string s) { f(x, s, 0.5); } // невозможно
void f(int x) { f(x, "Привет"); } // невозможно
```

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

```csharp
void f(int x, string s = "hello", double z = 0.5) { }
```

Возможные вызовы этого метода:

```csharp
f(2);
f(2, "привет");
f(2, "привет", 0.75);
```

Также возможно определение методов, принимающих список аргументов изменяемой длины `(varargs)`, как это сделано в методе `stdout.printf()`, хотя это не рекомендуется.Позже вы узнаете, как делать это.

Vala выполняет простую проверку аргументов и возвращаемого значения на равенство null. Если аргументу или возвращаемому значению позволено быть null, после типа ставится модификатор ?. Это помогает компилятору Vala производить статические проверки и добавлять диагностический код для методов, который поможет избежать, например, таких ошибок, как разыменование ссылки со значением null.

```csharp
string? method_name(string? text, Foo? foo, Bar bar) {
// ...
}
```

В этом примере параметры `foo` и `text`, а также возвращаемое значение могут принимать значение `null`, однако параметр bar не должен быть `null`.


---

# Agent Instructions: 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:

```
GET https://vala.gitbook.io/vala/untitled/language-elements/methods.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
