C#中關於Value、Reference、Pointer觀念

        private void button1_Click(object sender, EventArgs e)
        {
            //【1】Value Type[實質型別]
            //【2】Reference Type[參考型別]
            //【3】Pointer Type[指標型別]    //較少使用

            //【1】Value Type[實質型別]
            int a = 10;
            int b = a;
            MessageBox.Show("a= " + a + " ;b= " + b);

            //【2】Reference Type[參考型別]
            student s = new student();
            //創建一個記憶體空間名為S,其記憶體空間儲存的是:在Heap空間中的依照student架構所建立的物件object,該物件的記憶體位址。
            //簡單說就是一個叫S的記憶體空間儲存一個記憶體位址,這個位址指向在Heap空間中的object物件student(依照class類別架構創出)。
            s.name = "Wes";
            s.borned = "19851225";
            s.id = 109001001;
            s.grade = 2;
            MessageBox.Show(s.introduce());

            student s2 = s;
            //創建一個記憶體空間名為S2,其記憶體空間儲存的是:記憶體名為S空間的內容。
            //也就是S2跟S儲存一樣的記憶體位址,都是指向同一個在Heap空間中的object物件student(依照class類別架構創出)。
            s2.name = "Maggie";
            s2.borned = "19860705";
            s2.id = 109006008;
            MessageBox.Show(s.introduce());
            //s2與s指向的內容一樣,若輸入不同參數則改變的是同一個在Heap空間中的object物件。
            //在程式跑到s2傳入的資訊後,不管呼叫S或S1都會變成最後賦予的值(也就是S2所賦予的name、borned)
        }



補充資料一下找到的資料:

1. C# 型別(Type) 依照存取方式不同一共分為三種:Value Type、Reference Type 與 Pointer Type。

2. C# 變數裡的資料都是存放在記憶體(Memory)內的。

3.「int (整數)」就是一種 Value Type。它會先在記憶體中尋找一個空間,標記為變數名稱,然後將我們指定的數值存入。

4. 練習時所建立的 Student Class 則是一種 Reference Type。宣告 Reference Type 的變數時,也會先在記憶體中尋找一個空間,標記為變數名稱,然後裡面則「存放物件的記憶體位置」。

5. 物件必須要透過「new Class名稱()」的方式建立,沒有指向任何物件的 reference(參考) 變數,則存放著「null」。

6. 物件都是存放在一個稱為「Heap(堆疊)」的特殊記憶體區塊。



而關於Pointer 指標類型

有學過 C/C++ 程式語言的人相信都不陌生,而對部分的人來說,指標則是他們學習 C/C++ 的噩夢之一。指標是一種「專門存放記憶體位置」的變數。因為記憶體操作是一種非常危險的行為,而導致程式時常會不明地中斷。當然,如果對指標的行為有高度地了解,並且對程式使用記憶體的行為非常了解的話,就不會遇到這些錯誤。

一般來說,純物件導向的程式語言為了要隱藏背後複雜的操作行為,是不會給予使用者使用指標。例如 JAVA 的型別就只有兩種,Primitive Type 與 Class Type。但是 C# 則保留了指標這個型別,個人猜想可能是為了要延續 C/C++ 指標所扮演的重要性才留下來的。

補充資料來源:http://slmtsite.blogspot.com/2013/03/c-16-value-reference-type.html

留言