值類型:(原話定義)值類型的變數直接包含值,換言之變數引用的位置就是值在記憶體中實際存儲的位置。 這句話也就是說,值類型的賦值是不會引用同一記憶體位置的,除了out和ref參數,更改原始變數不影響其它變數的值(因為變數歌有各的位置) 棧 依次向下: int number1 =42; char lette ...
值類型:(原話定義)值類型的變數直接包含值,換言之變數引用的位置就是值在記憶體中實際存儲的位置。
這句話也就是說,值類型的賦值是不會引用同一記憶體位置的,除了out和ref參數,更改原始變數不影響其它變數的值(因為變數歌有各的位置)
棧
依次向下:
int number1 =42;
char letter ='A';
float pi = 3.14;
int number2 = number1;
總結:值類型的賦值會單獨開闢一個新的記憶體空間,這就引發了另兩個問題,第一個是空間占用問題,所以,規範是不要創建記憶體大於16位元組的值類型。第二個問題,由於值類型的值一般只能短時間存在,大多情況下,值類型的值和臨時值是存儲在稱為棧的臨時存儲區中,然而,臨時區清理的代價低於需要進行垃圾回收的堆,但是,值類型會更加頻繁地去復值,增加性能開銷,這點得註意;
引用類型:它得值是對一個對象的實例的引用,引用類型的變數是引用(通常是記憶體地址),去那個位置找到對象實例的數據。因此,”運行時“要從變數讀取引用,然後根據引用找到資源,從而到達實際包含實例數據的記憶體位置。即引用類型的變數關聯了兩個存儲位置。
引用類型指向堆,但是引用類型與變數關聯的存儲位置和值類型並沒有區別;若變數短時間存在,就在臨時存儲區分配它,對於引用類型的變數,它的值要麼是null,要麼是對需要進行垃圾回收的堆上的一個存儲位置的引用。
總結:由於引用類型只複製對數據的引用,因此兩個變數客引用相同的數據,這樣,賦值和方法調用都將改變相同引用變數的值;