Изучение C # Как ref и out позволяют этому работать в данном конкретном случае? - PullRequest
0 голосов
/ 14 октября 2018
class Program
{
    static void Main(string[] args)
    {

        double weight;
        string num;

        num = getWeight(out weight);
        Console.WriteLine(num + " lb = " + lbToKg(weight) + "kg");
        kgToLb(ref weight);
        Console.WriteLine(num + " kg = " + weight + "lb");

    }

    static string getWeight (out double theWeight)
    {
        theWeight = 10;
        return "Ten";
    }

    static double lbToKg(double pounds = 2)
    {
        return (pounds * 0.45359237);
    }

    static void kgToLb (ref double weight)
    {
        weight = (weight / 0.45359237);
    }

}

Итак, я предполагаю, что мой вопрос: в какой момент «вес» становится «весом» и что позволяет этому произойти?это вывод (out), перечисленный в методе getWeight ()?если так как?и как аргумент ref влияет на это?

Я чувствую, что я так близок к этому, и я просто хотел четко понять, как именно и почему это работает.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

ref и out практически одинаковы в этом контексте.Разница в том, что при ref объект должен быть инициализирован перед входом в функцию, а при out объект будет инициализирован внутри функции.Поскольку ваши объекты double, то инициализация не требуется, и два ключевых слова работают практически одинаково.Единственное отличие состоит в том, что с out вы должны присваивать значение, тогда как с ref это необязательно.

static void Main(string[] args)
{

    double weight;
    string num;

    num = getWeight(out weight);
        // here weight goes to the function and comes back with value of 10.
    Console.WriteLine(num + " lb = " + lbToKg(weight) + "kg");
    kgToLb(ref weight);
        // here again weight goes to the function and comes back with a new value
    Console.WriteLine(num + " kg = " + weight + "lb");

}

, поэтому на самом деле theWeight является локальной переменной, которая содержитссылка weight внутри функции getWeight.Это же вес внутри функции kgToLb.Надеюсь, что это понятно.

Вы можете прочитать больше здесь https://www.dotnettricks.com/learn/csharp/difference-between-ref-and-out-parameters

0 голосов
/ 14 октября 2018

Может показаться, что они делают одно и то же, но есть довольно важное различие в том, что происходит.Оба они передают параметр через ссылку, но их варианты использования различны, также как и некоторые другие правила.

'theWeight' становится 'weight'

Поскольку они передаютсяпо ссылке в обоих случаях theWeight и weight оба ссылаются на одно и то же значение.

Когда вы используете команду ref, переменная, которую вы передаете, должна быть инициализирована до вызова.Это не обязательно должно иметь место при использовании out.

Но с другой стороны, при использовании out в методе, параметр, отмеченный им, должен быть назначен перед методомготово.

Есть еще несколько отличий, но главное, что нужно убрать, это то, что оба передают переменную по ссылке.

...