Почему используя "in" происходит копирование струтуры?
Я не понял совершенно принцип работы "in" в C#.
public static void ChangePersonName(in IPerson person, string name)
{
person.Name = name;
}
public static void ChangeValue(in int value)
{
value = 20;
}
Почему первый метод не вызывает ошибки компилятора, хотя я пытаюсь изменить структуру внутри метода, что противоречит "in", а вот второй метод сразу выдает ошибку, что я меняю, хотя передаю по "in". Ну окей, может я в первом не могу как бы параметру присвоить новую структуру, а вот свойства менять могу, но тогда в таком случае после срабатывания метода свойства не поменяются, но как так, я ведь передаю по ссылке структуру? Я так понял происходит копирования, но ведь "in" передает параметр по ссылке. В общем я запутался...
Ответы (1 шт):
Потому что in не влияет на .Name и всё что внутри передаваемого объекта или структуры. Он влияет только на саму person.
in копирует структуру или ссылку на объект как если бы вы ничего не указали, но делает её только для чтения. Почему так: in гарантирует что аргумент не будет изменён даже за пределами метода. При передаче по рефу такое было бы невозможно.
Если нужно по рефу передавать неизменяемую, пишите readonly ref.