3-5 參考型別 v.s. 實質型別

實值型別:傳遞資料時,創建新資料並複製實際數值。
我們在 3-1 變數與基本常用的型別 提到的型別,包含 int、float、double、long……等等,
除了 string 以外,都是實值型別。此外,之後才會提到的 struct (結構) 與 enum (列舉),也是實值型別。

參考型別:傳遞資料時,直接傳遞該資料在記憶體的位置,也因此沒有產生新資料。
string 使用起來很像實值型別,然而它實際上是參考型別。 (很基本而且重要,請務必記得)
之後才會提到的 class (類別),也是參考型別。

null 關鍵字

null 是參考型別專用的關鍵字,代表「不指向任何記憶體位置」。
同時,參考型別的預設值一定是 null。

由於一般的實值型別的值無法為 null,因此通常你也可以想成可以指定成 null 的資料是參考型別。

== 與 != 運算子以及參考型別

在 3-3 運算子 教過的 == 運算子,用來判斷 2 個資料有沒有相等。
如果 int a = 10, b = 10,理所當然的會覺得 a == b 回傳 true。

然而在參考型別,== 用來判斷 2 個變數是不是參考到同一個記憶體位置。
用白話一點的方法來說,判斷 2 個變數是不是出自同一個記憶體位置。

這時候就該來談談參考,當我們透過參考修改某個資料,實際上是改動了該參考的目標記憶體中的資料。
這個改動一旦發生,其他參照到相同記憶體位置的參考,拿到的值也會發生改變。
這個例子在下面範例的 17 ~ 22 行可看到。
我們在 DoubleIntArray 傳進 a1 的參考,在該方法內的改動仍然會影響到 a1 本身。
然而,這種特性在實質型別不會發生。
此外,由於 string 型別本身有特別處理,因此看起來沒有這種影響。