← Все вопросы

В чём разница между ref и out в C#?

Задан 4 месяца назад497 просмотров2 ответа
9

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

void Increment(ref int x) { x++; }
void Parse(out int result) { result = 42; }

Когда что выбирать?

2 ответа

16
✓ Принятый ответ — помог автору

Главное различие — в требованиях к инициализации:

  • ref — переменную нужно инициализировать до передачи в метод. Метод может её прочитать и изменить.
  • out — переменную можно не инициализировать заранее, но метод обязан присвоить ей значение перед выходом.
int a = 10;          // обязательно инициализировать
Increment(ref a);    // a == 11, метод видел старое значение

int b;               // можно без значения
Parse(out b);        // метод ОБЯЗАН присвоить b
Console.WriteLine(b);// 42

Правило простое: ref — когда нужно и читать, и писать (двусторонний обмен). out — когда метод только возвращает дополнительные значения (например, int.TryParse).

if (int.TryParse("123", out int n))
    Console.WriteLine(n); // 123

С C# 7 можно объявлять out-переменную прямо в вызове — удобно.

6

Добавлю мнемонику: out = «наружу» (метод только выдаёт результат), ref = «reference» (полноценная двусторонняя ссылка).

Ещё нюанс: компилятор не даст прочитать out-параметр внутри метода, пока вы ему что-то не присвоили. А ref читать можно сразу.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект