close

參考型別有以下這些:

1  

 註:陣列是參考型別

參考型別是用new建立物件實體後, 記憶體位址存在 Stack 中,

該變數位圵則指到一塊稱為「Heap」 的記憶體區塊,

該區塊才是真正資料儲存的地方。

 

複製資料時,是把變數中存的記憶體位址複製到另外一個變數

所以這兩個變數的值是指到Heap中同一個記憶體位置的內容

只要更改這兩個其中一個的變數的內容

另外一個就會跟者變動

       //實質型別(結構)
        struct sNum
        {
            public int val;
            public sNum(int _val) { val = _val; }
        }

        //參考類型(類別)
        class cNum
        {
            public int val;
            public cNum(int _val) { val = _val; }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //new出來的時候,在Stack中會存放val=5
            sNum s1 = new sNum(5);
//把s1指定給s2, 是複製一份資料到stack中,val也是5 sNum s2 = s1;
//改變s2的val,不會影響原本的s1.val s2.val = 3;
//執行結果s1=5 , s2=3 Console.WriteLine("s1={0} , s2={1}", s1.val, s2.val); //new出來的時候,在Stack中存放的是位址,指向存在heap中的val=5 cNum c1 = new cNum(5);
//把c1指定給c2,是複製位址給c2,指向相同的地方 cNum c2 = c1;
//當變更c1或c2的val值,另一者也會跟著改變 c1.val = 3;
//執行結果c1=3 , c2=3 Console.WriteLine("c1={0} , c2={1}", c1.val, c2.val); }

 

補充:

堆疊 (Stack) 和堆積 (Heap) 是記憶體中,用來存放資料的兩種不同管理機制。

Stack:當程式載入時,就配置好固定大小的記憶體空間;

  •                當變數生命周期結束時,就由記憶體中移除。

Heap:當程式需要使用時,才透過記憶體配置方法,動態建立;當變數生命周期結束時,

  •               僅註明沒人使用,必須由程序釋放或由系統不定時的回收清空。

所有的區域變數 (不管是 Value Type 或是 Reference Type) 都儲存於 Stack 下,

使用 new 關鍵字實體化的類別實體,則儲存於 Heap 中

 

註:

什麼是CLR?
.NET Framework 提供稱為 Common Language Runtime 的執行階段環境,它能執行.NET的程式碼,並提供使程式開發過程更為容易的服務。
以下為通用語言執行平臺。

 

201452602717362.png  

 

 

 

參考來源:

http://vito-dotnet.blogspot.tw/2011/12/blog-post_16.html

http://www.dotblogs.com.tw/h091237557/archive/2014/05/26/145247.aspx

http://xingulin.tumblr.com/post/48493582986/ref-type-vs-val-type

http://msdn.microsoft.com/zh-tw/library/490f96s2.aspx

 

 

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小豆干 的頭像
    小豆干

    小豆干就是我唷

    小豆干 發表在 痞客邦 留言(0) 人氣()