Разница в коде? c # передача аргумента по ссылке - PullRequest
0 голосов
/ 08 ноября 2019

Просто пытаюсь понять, может ли кто-нибудь помочь мне понять это:

Какая разница в использовании между этими двумя примерами ниже? Когда второй, лучше передать аргумент по ссылке? Оба выдают одинаковый результат.

public static void Sqr(int x)
{
    x = x * x;
    Console.WriteLine(x);
}

static void Main(string[] args)
{
    Sqr(3);
}

2)

public static void Sqr(ref int x)
{
    x = x * x;
}

static void Main(string[] args)
{
    int a = 3;
    Sqr(ref a);
    Console.WriteLine(a);
}

Кто-нибудь знает? Я здесь невежественен. Моя проблема в том, что я даже не знаю, почему все написано так, как есть !! Есть идеи?

1 Ответ

2 голосов
/ 08 ноября 2019

Оба выводят один и тот же результат.

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

...