← Все вопросы
В чём разница между ref и out в C#?
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 читать можно сразу.
Ваш ответ
Войдите, чтобы ответить на вопрос.