Чем out отличается от ref?

1,00
р.
Функция с параметром с ключевым словом out даёт такой же результат, как и с ref.
Такой код:
private void func(out string value) { value = "Hello World!" }
Даёт такой же эффект, как и
private void func(ref string value) { value = "Hello World!" }
В чём же разница между out и ref?

Ответ
Разница в том, что out — это выходной параметр, а ref — входно-выходной.
Для ref-параметра вы должны передать его инициализированным, и можете пользоваться его исходным значением. А для out-параметра вы не обязаны инициализировать его перед вызовом функции, не можете использовать его значение в функции до присваивания, и обязаны инициализировать его в функции.
(Таким образом, ref-параметр немного напоминает инициализированную локальную переменную, а out-параметр — неинициализированную.)
Иллюстрация:
private void func1(out string value) { Console.WriteLine(value) // нельзя, value не инициализировано if (false) return // нельзя, забыли установить значение value value = "Hello World!" }
string s1 func1(out s1)
private void func2(ref string value) { Console.WriteLine(value) // можно if (false) return // не проблема, у value остаётся старое значение value = "Hello World!" }
string s2 func2(ref s2) // нельзя, функция имеет право использовать значение, // значит, оно должно быть инициализировано сначала
Таким образом, out-параметр — это как бы дополнительное возвращаемое значение функции. А ref-параметр — просто параметр, изменения которого видны снаружи функции.

На уровне CLR для out- и ref-параметров используется один и тот же механизм, но это незначительная техническая подробность. Разница в семантике.