По умолчанию при передачи параметра в функцию, функция не может изменить это параметр а только им воспользоваться, любые изменения внутри функции не скажутся на переменной. Однако это ситуацию можно изменить модификатором ref. При его использовании функция сможет изменять параметр. Смотрим пример:
using System; class MainClass { public static void Main(string[] args) { int a=1; int b=3; Test(a,ref b); Console.WriteLine(a); Console.WriteLine(b); } public static void Test(int a, ref int b) { a=10; b=20; } }
В данном примере функция может изменит параметр b, так как он был передан с модификатором ref. Смотрим результат:
Применение out аналогично как по смыслу так и по результату.
using System; class MainClass { public static void Main(string[] args) { int a=1; int b=3; //Test(a,ref b); Test(a,out b); Console.WriteLine(a); Console.WriteLine(b); } //public static void Test(int a, ref int b) public static void Test(int a, out int b) { a=10; b=20; } }
Хотя разница между этими модификаторами есть. При использовании Ref параметр должен быть обязательно инициализирован, а при out это не требуется. Вобщем-то для простых типов значения это не имеет, а вот на пример для перечислений значение есть. Ведь объявить переменную типа перечисления можно без начальной инициализации, тогда при передачу в функцию нужно указывать out, а если она была инициализирована, то ref.