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
{
//【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
留言
張貼留言