Правильно ли я размышляю по поводу ref и out?

Например, нам нужно передать в функцию три переменные a,b и s.
a и b - инициализировали, а s - нет.
Компилятор выдает ошибку, что Use of unassigned local variable ' s'.
Но, существуют ref и out. С помощью out мы можем передавать не инициализированные значения. А ref только инициализированные.
Правильное ли мое утверждение в этом коде, что a,b - ref по дефолту в CLR ?
class  Program
    {
    
        static void Add(double a, double b, out double s)
        {
            s = a + b;
        }
       
        static void Main(string[] args)
        {
            double a, b, s;



            a = Convert.ToInt32(Console.ReadLine());
            b = Convert.ToInt32(Console.ReadLine());
           
            Add(a, b, out s); // a - ref, b - ref, s - out


            Console.WriteLine(" Result "+s);
            

            Console.ReadKey();
        }
    
        }
  • Вопрос задан
  • 365 просмотров
Решения вопроса 2
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Не совсем. a и b передаются по значению. Это легко проверить, если написать в теле функции a = 17. Переменная в Main не изменится. В свою очередь переменная с передается как раз как ref, хоть и называется out. Отличие лишь в том, что переменная out может передаваться неинициированной, но объявленной.
Вот почитайте.
Ответ написан
Комментировать
tomnolane
@tomnolane
профессиональный разработчик
Правильное ли мое утверждение в этом коде, что a,b - ref по дефолту в CLR ?

нет.
Ключевое слово ref используется для передачи аргумента по ссылке, а не по значению.
Эффект передачи по ссылке в том, что все изменения вызываемого метода отражаются на значении переменной аргумента, используемой в вызове метода. Например если вызывающий объект передает выражение локальной переменной или выражение доступа к элементу массива и вызванный метод заменяет объект, на который ссылается параметр ref, то локальная переменная или элемент массива взывающего объекта теперь ссылаться на новый объект.
(источник)
вы передаёте (в примере) в static void Add значение, а не ссылку на это значение.

если не используете ref - то переменная будет менять своё значение (если к ней что-то добавите/отнимите и т.д.).
условно:
int a = 1;
a = a*5+9; // a=14;


Если будете использовать ref - то, "значение" будет меняться по ссылке

static void Method(ref int i)
        { 
            i = i + 30;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val); 
            // Output: 31
        }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы