У меня есть следующий код С# ниже.
Object first = 5;
Object second = 10;
second = first;
Console.WriteLine(first + " " + second);
Object a = 3;
Object b = a;
a = 6;
Console.WriteLine(a + " " + b);
Я получаю следующий вывод:
5 5
6 3
На самом деле я ожидаю, что "6 6" будет вторым. Может ли кто-нибудь объяснить, где я ошибаюсь?
С уважением, Джастин Самуил.
Линия
a = 6;
присваивает a
ссылку на встроенный int new. b
продолжает ссылаться на значение (3), которое было помещено в бокс ранее.
Каждая переменная Object
будет содержать int
, которая является типом значения. a
и b
будут два разных экземпляра, поэтому изменение значения a
(что по существу означает, что ссылка a
ссылается на новый экземпляр int) не изменит значение b
. Вы можете изменить свой первый пример кода, чтобы получить аналогичный результат:
Object first = 5;
Object second = 10;
second = first;
first = 8;
Console.WriteLine(first + " " + second); // prints "8 5"
a
но делает ссылку другой объекта. a
Целые значения - это типы значений, а не ссылки.
Когда вы пишете этот
object a = 3;
object b = a;
вы назначаете значение 3 в b. Впоследствии, при
a = 6;
вы присваиваете значение 6 а, а b не влияет, потому что ему было присвоено значение 3.
a
и b
являются ссылками (на упакованные целые числа).
Когда вы устанавливаете a = 6, его единственная настройка a, b остается 3. (это ожидалось)
static unsafe void Main()
{
Object first = 5;
Object second = 10;
second = first;
Console.WriteLine(first + " " + second);
int i = 3;
int y = 6;
int* a = &i;
int** b = &a;
a = &y;
Console.WriteLine(*a + " " + **b);}
выполнить/небезопасно
5 5 6 6
:-). я бы не рекомендовал писать код таким образом, хотя =)