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