前言 昨天晚上閑著無事,就上csdn逛了一下,突然發現一個 "帖子" 很有意思,就點進去看了一下。 問題很精辟 int a = 1; object b=a; object c = b; c = 2; 為什麼b不會變成2呢?b和c應該指向堆裡面的同一個引用啊? 大神們的回答也讓我深思,這裡就把自己的理 ...
前言
昨天晚上閑著無事,就上csdn逛了一下,突然發現一個帖子很有意思,就點進去看了一下。
問題很精辟
int a = 1;
object b=a;
object c = b;
c = 2;
為什麼b不會變成2呢?b和c應該指向堆裡面的同一個引用啊?
大神們的回答也讓我深思,這裡就把自己的理解寫出來,如果有誤,還請告知。
本文測試代碼:
static void Main()
{
int a = 1;
object b = a;
object c = b;
c = 2;
}
使用ildasm.exe查看結果:
增加註釋:
我對於IL代碼的自己理解思路:
1、Idc.i4.1、 stloc.0 ==> int a = 1;
2、Idloc.0、 box[mscorlib]System.Int32、 stloc.1 ==> object b = a;(b指向在堆棧上新建對象值為1,與a無任何聯繫)
3、Idloc.1、 stloc.2 ==> object c = b;
4、Idc.i4.2、 box[mscorlib]System.Int32、 stloc.2 ==> c = 2;(c指向堆棧上新建對象值為2)