В вашем примере не имеет значения, как Kotlin будет обрабатывать значения по сравнению со ссылками, потому что вы переназначаете переменную, а не изменяете ее через функцию-член или свойство.
Если мы изменим пример, то ваш число заключено в непостоянный объект, подобный этому:
class WrappedInteger(var value: Int)
var x = WrappedInteger(14)
var y = x
y.value = 5
println(x.value) // prints "5"
Значение x
изменяется на 5, когда вы вызываете установщик для y.value
, потому что y
указывает на тот же объект, что и x
.
Я думаю, C# - это то же самое, но вы можете подвести итог поведения следующим образом: Kotlin всегда проходит по значению, а ссылки являются неизменяемыми указателями, которые неявно разыменовывается, когда вы получаете доступ к своим членам. Таким образом, ссылки также передаются по значению ... вы просто не можете увидеть или изменить значение (адрес того, на что оно указывает).
Kotlin не имеет structs
подобно C#, таким образом, вы не можете передать группу данных по значению (копируя их). У него есть классы data
, которые поставляются с предварительно сгенерированной функцией copy()
, которую можно вызывать вручную. Вы также можете определить все свойства вашего класса данных только для чтения val
, поэтому вам не нужно беспокоиться о том, что переданный объект будет изменен какой-либо функцией.