Основы C#. Урок 28. Передача параметров по ссылке и по значению (ref и out)
Если мы передаем в некоторую функцию параметр, то функция по умолчанию работает с копией параметра, а не с оригиналом. Это называется перередача по значению. При этом при изменении передаваемого параметра внутри функции значение соответствующей переменной вне функции не изменится. Иногда же нам надо, что бы функция действительно изменяла передаваемые в нее параметры. Для этого мы должны передавать их по ссылке. Для этого мы используем ключевое слово ref. Вот пример:
class Test { static void SomeFunction1(int a) { a=12; //Изменяем копию параметра функции } static void SomeFunction2(ref int a) { a=55; //Изменяем оригинал параметра функции } public static void Main() { int z=23; SomeFunction1(z); Console.WriteLine(z); //Напечатается 23 SomeFunction2(ref z); Console.WriteLine(z); //Напечатается 55 } }
Обратите внимание, что при вызове функции SomeFunction2 мы опять используем ключевое слово ref (как и при объявлении этой функции):
... SomeFunction2(ref z); ...
Параметр out аналогичен параметру ref, только при его использовании в функцию можно передавать неинициализированные переменные (т. е. переменные с незаданными начальными значениями). Вот пример:
class Test { static void SomeFunction2(ref int a) { a=55; } static void SomeFunction3(out int a) { a=66; } public static void Main() { int z=0; //Переменную z надо обязательно инициализировать SomeFunction2(ref z); Console.WriteLine(z); //Напечатается 55 int y; //Переменную y можно не инициализировать SomeFunction3(out y); Console.WriteLine(y); //Напечатается 66 } }
При вызове такой функции обязательно использование ключевого слова out.