C#

ЗАЧЕМ Ref и Out в C#???

Объясните мне пожалуйста зачем нам нужны реф и оут в си шарпе??? Нужны ли они в реальных проектах??? Зачем они ??? Если нужны когда их нужно использовать???
Дело в том, что параметры в C# передаются по значению.
Например, вы можете подать в метод константу или значение переменной:
 void Process(int q) {
q = q * q;
Console.WriteLine(q);
}
...
Process(5);

int x = 9;
Process(x);
Console.WriteLine(x);
Внутри метода process значение параметра q меняется на q в квадрате.
Однако это никак не влияет на значение переменной x, которую мы вроде как подали.
Изменения, внесенные методом в его параметр, забываются, как только метод завершает работу.

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

Другой пример - объект:
 class Person {
public string name;
public int age;
public override string ToString() {
return name + " " + age;
}
}

void UpdatePerson(Person p) {
p.age++;
}

void ReplacePerson(Person p) {
p = new Person();
p.name = "Роберт";
p.age = 30;
}
...
Person q = new Person();
q.name = "Иван";
q.age = 25;
Console.WriteLine(q);
UpdatePerson(q);
Console.WriteLine(q);
ReplacePerson(q);
Console.WriteLine(q);
Здесь метод UpdatePerson получает значение - ссылку на объект типа Person.
И может менять его поля. Например, увеличить возраст.

А вот метод ReplacePerson не заменяет Ивана на Роберта, так как он не имеет доступа к переменной q и не может менять значение ссылки, записанной в эту переменную.

Чтобы иметь возможность изменить значение ссылки, параметр помечают словом ref:
 void Process(ref int q) { 
q = q * q;
Console.WriteLine(q);
}
...
//Константу уже не подать, нужна переменная
//Process(5);

int x = 9;
Process(ref x);
Console.WriteLine(x);
Метод может менять или не менять переменную в параметре с пометкой ref.

Метка out позволяет обозначить выходной параметр, в который метод обязательно запишет некий результат.
 void ReplacePerson(out Person p) { 
p = new Person();
p.name = "Роберт";
p.age = 30;
}
...
ReplacePerson(out Person w);
Console.WriteLine(w);
В качестве out-параметра мы можем подать переменную, которую мы объявили ранее или объявляем прямо тут - в скобках при вызове метода.
Илюша :3
Илюша :3
54 613
Лучший ответ
>Объясните мне пожалуйста зачем нам нужны реф и оут в си шарпе???
  1. Чтобы возвращать значения из методов
  2. Чтобы не создавать копию большого объекта при передаче в метод. Большинство объектов передаются по ссылке всегда, но некоторые (например, массивы) копируются.

>Нужны ли они в реальных проектах???
Да.

>Зачем они ???
  1. Чтобы возвращать значения из методов
  2. Чтобы не создавать копию большого объекта при передаче в метод.

>Если нужны когда их нужно использовать???
  1. Когда нужно возвращать более чем одно значение из метода
2. Когда нужно экономить память и ресурсы стека.
Ответ там ↓, а еще в гугле, яндексе и других поисковиках.