C # - Найти выход - PullRequest
       19

C # - Найти выход

2 голосов
/ 27 октября 2009

У меня есть следующий код C # ниже.

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" в качестве второго сета. Кто-нибудь может объяснить, где я не прав?

С уважением, Джастин Самуэль.

Ответы [ 5 ]

4 голосов
/ 27 октября 2009

Линия

a = 6;

присваивает a со ссылкой на недавно упакованный int.
b продолжает ссылаться на значение (3), которое было упаковано ранее.

1 голос
/ 27 октября 2009

Каждая переменная 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"
1 голос
/ 27 октября 2009

Целые числа являются типами значений, а не ссылками.

Когда вы пишете это

object a = 3;
object b = a;

Вы присваиваете значение 3 для b. Впоследствии, с

a = 6;

Вы присваиваете значение 6 для a, и b не изменяется, поскольку ему было присвоено значение 3.

0 голосов
/ 27 октября 2009
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);}

complit с / unsafe

5    5
6    6

:-). я бы не советовал писать код таким образом =)

0 голосов
/ 27 октября 2009

Когда вы устанавливаете a = 6, единственная настройка a, b остается 3. (этого следовало ожидать)

...