CLR值類型和引用類型

知識點:引用類型、值類型、裝箱、拆箱ide

CLR支持兩種類型:引用類型和值類型。引用類型在堆上分配內存,值類型在線程棧上分配內存。值類型與引用類型以下所示:spa

 

值類型對象有兩種表示形式:未裝箱和已裝箱。將一個值類型的變量付給另外一個值類型變量,會執行一次逐字段的複製。線程

裝箱:將一個值類型轉換爲一個引用類型稱爲裝箱。裝箱會發生以下操做:指針

一、在託管堆中分配好內存。分配的內存大小等於值類型各個字段須要的內存大小之和加上類型對象指針和同步塊索引須要的內存量。code

二、值類型的字段複製到新分配的堆內存。orm

三、返回對象的地址。對象

拆箱:將一個引用類型轉換爲值類型,首先值類型的內存分配在線程棧中,而引用類型的內存分配在託管堆中,因此須要把引用類型中的全部字段都複製到線程棧中。CLR經過兩個步驟來完成這個複製操做。blog

一、獲取已裝箱的對象中的各個字段的地址。這個過程稱爲拆箱。索引

二、將這些字段包含的值從託管堆複製到線程棧中。內存

經過下面例子來深刻理解裝箱和拆箱:

internal struct Point
    {
        private int _x, _y;

        public Point(int x = 0, int y = 0)
        {
            _x = x;
            _y = y;
        }

        public void Change(int x = 0, int y = 0)
        {
            _x = x;
            _y = y;
        }

        public override string ToString()
        {
            return string.Format("{0},{1}",_x,_y);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Point p = new Point(x:1,y:1);
            Console.WriteLine(p);
            p.Change(x:2,y:2);
            Console.WriteLine(p);
            Object o = p;
            Console.WriteLine(o);
            ((Point)o).Change(x:3,y:3);
            //這個執行結果是多少?爲何?
            Console.WriteLine(o);
            Console.ReadLine();

        }
    }
相關文章
相關標籤/搜索