Функция с параметром с ключевым словом 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-параметров используется один и тот же механизм, но это незначительная техническая подробность. Разница в семантике.