首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

值類型與引用類型(中):通用規則、字串特殊性、裝箱拆箱、判等與轉換全解析

     編輯:關於.NET

承接[上集](第八回),本文從語言規則、特殊類型、核心機制三維度,系統整理值/引用類型的比較規則、應用場景與易錯陷阱。

通用規則對照表

特性值類型引用類型
繼承鏈ValueType → Object直接繼承 Object
記憶體堆疊 (內含資料)堆 (變數存引用)
指派成員複製 (深拷貝)引用複製 (淺拷貝)
參數傳遞預設複製實例預設複製引用
Null不可為 null (C# 2.0 前)預設 null
繼承密封,不可繼承類別,可實作介面可繼承、可多型
GC不受管,作用域結束自動釋放GC 追蹤回收
裝箱有裝箱/未裝箱兩種狀態永遠是裝箱狀態
sizeof支援不支援
基元類型對應int→Int32, double→Double 等無對應

字串:披著引用類型外衣的「值類型行為」

string 繼承 Object 是引用類型,但:

  • 不可變:任何修改操作 (s += "x") 實為建立新字串、舊字串不變
  • 參數傳遞表現如值類型:void M(string s){ s="new"; } 外部原變數不變,因方法內 s 指向新物件
  • == 重載比較內容:"123" == "123" 為 true (內容相等),非引用相等

本質原因:不可變性 + 運算子重載,而非特殊傳遞規則。參考 Artech《深入理解 string》獲取更多效能建議。

裝箱與拆箱:值類型的雙重身分

  • 裝箱:值類型 → Object/介面,堆配置物件、複製值
  • 拆箱:Object → 值類型,檢查型別、複製值回堆疊
  • 效能殺手:頻繁裝箱 (如 ArrayList.Add(3)) 產生大量臨時物件,增加 GC 壓力

ValueType 重寫 Equals 實現值比較,解決裝箱後判等問題。

判等三大方法深度解析

方法值類型引用類型
ReferenceEquals(a,b)永遠 false (雙重裝箱)同一實例 true;null==null true
Equals(a,b) 靜態處理 null,委派虛方法同實例/同 null/虛方法 true
a.Equals(b) 虛ValueType: 欄位逐一比較預設引用比較,常重寫
a == b未重載則位元比較預設引用比較,常重載 (如 string)

最佳實踐:自訂類型務必重寫 Equals/GetHashCode,並考慮重載 ==/!=。

類型轉換分類

  • 隱式:安全、無損失 (數值擴展、衍生→基底、裝箱)
  • 顯式 (Cast):可能損失/失敗 (數值縮小、基底→衍生、拆箱)
  • is/as:安全模式轉換,as 失敗回傳 null
  • Convert/Parse:字串↔基元類型
  • 自訂 implicit/explicit 運算子:需 static,定義類型間轉換規則

應用選型指南

優先考慮 struct 當:資料量小 (<16 bytes)、邏輯簡單、無繼承/多型需求、高頻建立/銷毀、需值語義安全。

必須用 class 當:需繼承、多型、複雜行為封裝、參考語義共享、頻繁裝箱場景 (改用 class 避免裝箱)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved