Известно, что в C# тип значения можно передать методу по ссылке с модификатором ref.
struct Point {
float x, y
}
float Dst(ref Point a, ref Point b) {
//code
}
В этом случае при вызове метода необходимо также указать ref напротив соответствующего параметра.
Point a, b;
//point initialization
float dst = Dst(ref a, ref b);
Существует также модификатор in, который работает почти так же, как readonly ref, но его не обязательно указывать при вызове метода.
float Dst(in Point a, in Point b) {
//code
}
.
Point a, b;
//point initialization
//both variants are possible
float dst = Dst(in a, in b);
float dst = Dst(a, b);
В чем разница между указанием модификатора in при вызове метода и его отсутствием? Копируется ли структура в том или ином случае?
P.S. Я знаю о ссылке только для чтения в новых версиях C#, но использую более старую версию.





В чем разница между указанием модификатора in при вызове метода и его отсутствием? Копируется ли структура в том или ином случае?
Когда вы используете in, вы все равно передаете по ссылке (как в случае с ref), поэтому само значение не копируется, но цель состоит в том, что, поскольку метод «не может» изменить значение, вы не сможете чтобы увидеть разницу. Поэтому вам не обязательно указывать его на месте вызова.
Есть способы обойти это, но обычно они включают в себя хитрость, просто чтобы доказать, что вы что-то ломаете.
Что касается разницы между in и readonly ref, спецификация функции, вероятно, является лучшим источником информации.
in также передаст значение по ссылке, аналогично ref, но также пометит параметр как неизменяемый, чтобы предотвратить любые его изменения в области действия функции. Независимо от того, укажете ли вы явно in или нет при передаче параметров, компилятор все равно будет обрабатывать его как таковой.