C# 「什麼 Datetime 竟然是 Value Type?」
2021-06-24
從 DateType 屬於 Value Type 這個事實進而探討 Struct 與 Class 的差別,以及 Value Type 與 Reference Type 的差異所在。
說明
對於 Value Type 的認知有誤,以為簡單的資料類型如 Int, Float, Char 都是屬於 Value Type,而類別、物件類型的資料類型則是屬於 Reference Type。但事實上並非如此,依照 C# 規格書的定義,Value Type 實際上所包含的是 Struct Type 及 Enum Type。其中 Struct Type 包含 nullable Type 以及一些預先定義好的 Struct Type 稱為 Simple Type。Simple Type 包含了所有的數值類型(decimal, byte, short, ushort, int, uint, long, ulong, char, double, sbyte, float)以及布林類型(bool)。
而 DateTime 是屬於 Struct Type,因此也就屬於 Value Type。
另一個誤會則是不只有 Class 可以定義 Field, Property, Method,Struct 也可以有對應的定義,因此判斷 Value Type 或 Reference Type 與否,不是透過 Field, Property, Method 等功能來判斷。
另一個驚訝則是 String 不是 Value Type 而是 Reference Type。
Value Type
而雖然有 Value Type 與 Reference Type 的區分,但在 C# 世界中,所有的 Type 都是直接或間接的源自屬於 Reference Type 的 Object Type,而 Reference Type 的資料值被視為 Object 而 Value Type 則被以 Boxing 及 Unboxing 操作的方式作為 Object。
Reference Type
Reference Type 包含了 Class Type, Interface Type, Array Type 以及 Delegate Type。其中經常使用的 Object, Dynamic, String 都是屬於 Class Type。
Struct VS Class
兩者的差別來自於分屬 Value Type 與 Reference Type。此外另一個特性是 Struct Type 無法為 Null,所以才有 Nullable Type 的出現,而 Reference Type 可以為 Null。
Value Type VS Reference Type
Value Type 資料是儲存於記憶體的 Stack 之中;Reference Type 則是儲存於記憶體的 Heap 之中。
參考資料
https://dotblogs.com.tw/daniel/2018/02/22/135011