using string = System.String; 自動產生)。SByte, UInt16)。Int32→Int64 隱式,反向需顯式(截斷處理)。unchecked/checked 控制溢位檢查。每個運算子對應兩組 IL 指令(如 Add/Add.ovf)。預設關閉溢位檢查。/checked+ 編譯器開關;checked/unchecked 運算子或區塊。Decimal 在 CLR 非基元類型,checked 對其無效。struct 和 enum 為值類型;其餘為引用類型(Int32, Boolean, Decimal, TimeSpan 皆為結構)。struct → System.ValueType → System.Object;enum → System.Enum → System.ValueType。sealed,可實作介面。new 對值類型:C# 確保所有欄位初始化為 0;用 new 則視為已初始化。sealed。Boxing:1) 託管堆配置記憶體(含欄位、型別物件指標、同步區塊索引)。2) 複製欄位至新記憶體。3) 返回物件位址。→ 已裝箱物件生命週期超過未裝箱值類型(後者可重用,前者待 GC 回收)。
Unboxing:1) 取得已裝箱物件欄位位址。2) 將值從堆複製至堆疊值類型實例。→ 引用為 null 拋 NullReferenceException;無法正確轉型拋 InvalidCastException。
裝箱前型別為何,拆箱必須轉回該型別(基底/衍生類型皆不行):Int16 y = (Int16)(Int32)o;。拆箱返回已裝箱物件未裝箱部分的位址。
減少裝箱:多數方法多載為減少值類型裝箱(如 Console.WriteLine)。可為自己類別定義泛型方法(型別參數為值類型則無裝箱)。最壞情況手動控制:Object o = v; WriteLine("{0},{1},{2}", o, o, o); 僅裝箱一次。
未裝箱值類型無同步區塊索引,不可用 Monitor 或 lock。值類型可用 Object 虛方法 Equals, GetHashCode, ToString(ValueType 重寫,參數為未裝箱型別,CLR 以非虛方式直接呼叫)。非虛方法 GetType, MemberwiseClone 需裝箱。值類型實作介面並轉型為介面時需裝箱。
範例展示:直接轉型修改為臨時物件;透過介面修改可改變原裝箱物件。
Equality(型別與成員相同)。Identity(指向同一物件)。Object.Equals 預設實作同一性。重寫 Equals 實現相等性:先檢查 null、再比較 GetType()、最後比較所有欄位。Equals 後無法測試同一性,Object.ReferenceEquals 提供同一性檢查。勿用 C# ==(可能重載),除非轉型為 Object。ValueType 以反射重寫 Equals(檢測相等性),自訂值類型應重寫提升效能,勿呼叫 base.Equals()。Equals 必須重寫 GetHashCode,否則編譯器警告(Hashtable/Dictionary 要求相等物件哈希碼相同)。HashCode 定位。修改鍵值導致找不到,正確做法:先移除再新增。Object.GetHashCode 取得唯一性。FCL 提供 RuntimeHelpers.GetHashCode(靜態,非重寫)。ValueType 以反射實作 GetHashCode。