Передача параметров по умолчанию в .Net выполняется по значению.Это верно как для типов значений, так и для ссылочных типов.Разница заключается в том, что со ссылочным типом вы передаете ссылку на экземпляр по значению в сравнении с реальным объектом.
Эффект является ссылкой so
в исходной функции, а некоторые функции являются независимыми.Изменение экземпляра, на который ссылается ссылка, не влияет на другой.Однако, поскольку они ссылаются на один и тот же объект, они могут видеть мутации этого объекта, сделанные другим (именно поэтому x изменяется в вашем примере)
SomeObject so = new SomeObject();
so.x = 42;
somefunction(so);
Console.Write(so.x); // will print 42
static void somefunction(SomeObject so) {
so = new SomeObject();
so.x = 13;
}
Модификатор ref
вызывает передачу параметрассылка вместо значения.Фактически, копия ссылки отсутствует, so
в исходной и вызывающей функциях - это одна и та же ссылка.Таким образом, сброс одного сбрасывает другой
SomeObject so = new SomeObject();
so.x = 42;
somefunction(ref so);
Console.Write(so.x); // will print 13
static void somefunction(ref SomeObject so) {
so = new SomeObject();
so.x = 13;
}