Как kotlin обрабатывает тип значения и ссылочный тип? - PullRequest
0 голосов
/ 20 января 2020

Я сдвинут с c# на kotlin. Не уверен, как kotlin обрабатывает типы данных ссылочного типа и типа значения, также не уверен, как kotlin обрабатывает ссылку, когда мы присваиваем одну переменную другой, например:

var x = 14
var y = x
y = 5
println(x)

Я не уверен, что она напечатает 14 или 5

Спасибо

Ответы [ 2 ]

1 голос
/ 20 января 2020

Это действительно печатает 14. Kotlin всегда передается по значению , так как оно использует те же принципы, что и Java.

Вы можете сделать это сами в KotlinPlayground .

0 голосов
/ 20 января 2020

В вашем примере не имеет значения, как 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, поэтому вам не нужно беспокоиться о том, что переданный объект будет изменен какой-либо функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...