2009-10-27 6 views
2

J'ai le code C# ci-dessous.C# - Recherche la sortie

Object first = 5; 
Object second = 10; 
second = first; 
Console.WriteLine(first + " " + second); 


Object a = 3; 
Object b = a; 
a = 6; 
Console.WriteLine(a + " " + b); 

je reçois la sortie suivante:

5 5 
6 3 

En fait, je me attends "6 6" comme le deuxième set. Quelqu'un peut-il expliquer où je me trompe?

Cordialement, Justin Samuel.

+1

Belle question à un examen d'admission –

Répondre

4

La ligne

a = 6; 

cessionnaires a avec la référence à un nouvellement boxed int.
b continue de référencer la valeur (3) qui était encadrée plus tôt.

0

Lorsque vous définissez un = 6, le réglage seulement, b reste 3. (ce serait prévu)

1

Chaque variable Object contiendra une int qui est un type de valeur . a et b seront deux instances différentes, donc en changeant la valeur de a (ce qui signifie essentiellement avoir a référence une nouvelle instance int) ne modifiera pas la valeur de b. Vous pouvez modifier votre premier échantillon de code pour produire un résultat similaire:

Object first = 5; 
Object second = 10; 
second = first; 
first = 8; 
Console.WriteLine(first + " " + second); // prints "8 5" 
+1

Il ne modifie pas la valeur (int) de 'a' mais fait référence' a' à un objet différent. –

+0

@Henk: oui, c'est une façon plus claire de l'exprimer. –

+0

Henk a absolument raison. –

1

Les entiers sont des types de valeur et non des références.

Lorsque vous écrivez ce

object a = 3; 
object b = a; 

vous attribuez la valeur 3 à b. La suite, avec

a = 6; 

vous attribuez la valeur 6 à un, et b n'est pas affecté, car il a été attribué la valeur 3.

+0

Mais 'a' et' b' sont des références ('a boxed int). –

0
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 avec/dangereux

 
5 5 
6 6 

:-). Je ne recommanderais pas d'écrire du code de cette façon =)