Оба выводят один и тот же результат.
Это потому, что помимо изменения параметра ref
вы изменили то, где вы получили вывод.
Вот версия вашего первого куска кода, которая ближе ко второму, поэтому они только отличаются тем, является ли это параметром ref:
public static void Sqr(int x)
{
x = x * x;
}
static void Main(string[] args)
{
int a = 3;
Sqr(a);
Console.WriteLine(a);
}
Теперьвыходное значение будет равно 3, поскольку значение a
не изменилось - его значение было передано методу Sqr
. Во втором примере сама переменная передается по ссылке, поэтому x
в методе Sqr
и a
в методе Main
ссылаются на то же место хранения ... изменениек значению x
можно «увидеть» через a
после возврата метода.
Когда второй, лучше передать аргумент по ссылке?
Когда вы хотите, чтобы изменения в параметре были отражены в аргументе. Это относительно редко, и я рекомендую вам использовать параметры-значения по умолчанию. Например, было бы более идиоматичным записать Sqr
как:
public static int Sqr(int x)
{
return x * x;
}
Затем вызвать его как:
a = Sqr(a);
ref
параметры относительно редко полезный в моем опыте - но важно понять, как они работают. (Вы можете найти мою статью о передаче параметров полезной для более подробной информации.)