
C# ref в сравнении с out
Ключевые слова Ref и out в C# используются для передачи аргументов внутри метода или функции. Оба слова указывают на то, что аргумент/параметр передается по ссылке. По умолчанию параметры передаются в метод по значению. Используя эти ключевые слова (ref и out), мы можем передать параметр по ссылке.
Ключевое слово ref
Ключевое слово ref передает аргументы по ссылке. Это означает, что любые изменения, внесенные в этот аргумент в методе, будут отражены в этой переменной, когда управление вернется к вызывающему методу.
Пример кода
public static string GetNextName(ref int id) { string returnText = "Next-" + id.ToString(); id += 1; return returnText; } static void Main(string[] args) { int i = 1; Console.WriteLine("Previous value of integer i:" + i.ToString()); string test = GetNextName(ref i); Console.WriteLine("Current value of integer i:" + i.ToString()); }
Вывод

Ключевое слово out
Ключевое слово out передает аргументы по ссылке. Это очень похоже на ключевое слово ref.
Пример кода
public static string GetNextNameByOut(out int id) { id = 1; string returnText = "Next-" + id.ToString(); return returnText; } static void Main(string[] args) { int i = 0; Console.WriteLine("Previous value of integer i:" + i.ToString()); string test = GetNextNameByOut(out i); Console.WriteLine("Current value of integer i:" + i.ToString()); }
Вывод

Ref в сравнении с Out
Ref | Out |
Параметр или аргумент должен быть сначала инициализирован, прежде чем он будет передан в | Инициализация параметра или аргумента перед передачей его в |
Не требуется присваивать или инициализировать значение параметра (который передается по | Вызываемый метод обязан присвоить или инициализировать значение параметра (который передается в |
Передача значения параметра по | Объявление параметра в методе |
Инициализация значения параметра перед его использованием в вызывающем методе не обязательна. | Значение параметра должно быть инициализировано в вызывающем методе перед его использованием. |
Когда мы используем | Когда мы используем |
И | |
Свойства не являются переменными, поэтому они не могут быть переданы в качестве параметра | |
Ключевое слово Ref / Out и перегрузка методов
И ref, и out обрабатываются по-разному во время выполнения программы, и одинаково во время компиляции, поэтому методы не могут быть перегружены, если один метод принимает аргумент как ref, а другой — как out.
Пример кода
public static string GetNextName(ref int id) { string returnText = "Next-" + id.ToString(); id += 1; return returnText; } public static string GetNextName(out int id) { id = 1; string returnText = "Next-" + id.ToString(); return returnText; }
Вывод при компиляции кода:

Однако перегрузка методов возможна, когда один метод принимает аргумент ref или out, а другой принимает тот же аргумент без ref или out.
Пример кода
public static string GetNextName(int id) { string returnText = "Next-" + id.ToString(); id += 1; return returnText; } public static string GetNextName(ref int id) { string returnText = "Next-" + id.ToString(); id += 1; return returnText; }
Резюме
Ключевые слова out и ref полезны, когда мы хотим вернуть значение в тех же переменных, которые были переданы в качестве аргумента.
Материал подготовлен в рамках специализации «C# Developer». Если вам интересно узнать подробнее о формате обучения и программе, познакомиться с преподавателем курса — приглашаем на день открытых дверей онлайн. Регистрация здесь.
