C#
ЗАЧЕМ Ref и Out в C#???
Объясните мне пожалуйста зачем нам нужны реф и оут в си шарпе??? Нужны ли они в реальных проектах??? Зачем они ??? Если нужны когда их нужно использовать???
Дело в том, что параметры в C# передаются по значению.
Например, вы можете подать в метод константу или значение переменной:
Однако это никак не влияет на значение переменной x, которую мы вроде как подали.
Изменения, внесенные методом в его параметр, забываются, как только метод завершает работу.
Это связано с тем, что на самом деле мы подали не саму переменную, а только ее значение. Метод ничего не знает о переменной x и не может работать с ней через параметр.
Другой пример - объект:
И может менять его поля. Например, увеличить возраст.
А вот метод ReplacePerson не заменяет Ивана на Роберта, так как он не имеет доступа к переменной q и не может менять значение ссылки, записанной в эту переменную.
Чтобы иметь возможность изменить значение ссылки, параметр помечают словом ref:
Метка out позволяет обозначить выходной параметр, в который метод обязательно запишет некий результат.
Например, вы можете подать в метод константу или значение переменной:
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-параметра мы можем подать переменную, которую мы объявили ранее или объявляем прямо тут - в скобках при вызове метода.>Объясните мне пожалуйста зачем нам нужны реф и оут в си шарпе???
>Нужны ли они в реальных проектах???
Да.
>Зачем они ???
>Если нужны когда их нужно использовать???
- Чтобы возвращать значения из методов
- Чтобы не создавать копию большого объекта при передаче в метод. Большинство объектов передаются по ссылке всегда, но некоторые (например, массивы) копируются.
>Нужны ли они в реальных проектах???
Да.
>Зачем они ???
- Чтобы возвращать значения из методов
- Чтобы не создавать копию большого объекта при передаче в метод.
>Если нужны когда их нужно использовать???
- Когда нужно возвращать более чем одно значение из метода
Ответ там ↓, а еще в гугле, яндексе и других поисковиках.

Похожие вопросы
- Стоит ли дальше учить C#?
- Программирование на C Sharp (C#)
- Сегодня начал учить c#, решил сделать калькулятор простой и столкнулся с такой ошибкой при компиляции, хелпуйте.
- Что лучше C# или C++?
- Зачем разбивать код в C# на отдельные классы?
- Помогите пожалуйста. Написать на C#
- Python, C, C++, C#, Что выбрать-то?
- Помогите разобраться с заданием! C#
- Стоит ли изучать c# в 13 лет?
- Нужна помощь с задачей C#