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

C# 參數傳遞機制深度解析:實值型別 vs 參考型別

     編輯:關於C語言

核心概念

.NET 型別系統分為兩大類:

  • 實值型別:儲存在堆疊,變數直接包含資料。包含基本型別 (int, double, char)、enum、struct。
  • 參考型別:儲存在受控堆積,變數儲存物件參考 (位址)。包含 class、interface、delegate、array、string。

參考型別行為示範

StringBuilder first = new StringBuilder();
StringBuilder second = first;          // 兩變數指向同一物件
first.Append("hello");
first = null;                          // first 不再參考物件,但物件仍存在
Console.WriteLine(second);             // 輸出 "hello"

second 仍參考原物件,故可輸出修改後內容。將參考設為 null 僅切斷變數與物件連結,不影響其他參考同一物件的變數。

實值型別行為示範

struct IntHolder { public int i; }

IntHolder first = new IntHolder(); first.i = 5;
IntHolder second = first;              // 實值複製
first.i = 6;
Console.WriteLine(second.i);           // 輸出 5

second 獲得 first 的資料複本,後續修改 first 不影響 second。

特殊情況:不可變參考型別

string 是參考型別,但行為類似實值型別:

string s1 = "hello";
string s2 = s1;
s1 = "world";        // s1 指向新字串物件,s2 仍為 "hello"

任何「修改」字串的操作 (Replace, Substring 等) 實際上都會建立新字串物件,原物件不變。

方法參數傳遞預設行為

型別分類預設傳遞方式效果
實值型別傳值方法內修改不影響呼叫端變數
參考型別傳參考 (參考本身傳值)方法內修改物件內容影響呼叫端;重新指派參數不影響呼叫端變數

改變傳遞行為的關鍵字

  • ref:呼叫端變數必須初始化,方法可替換整個變數 (實值型別換值、參考型別換參考)。
  • out:呼叫端變數無需初始化,方法必須指派值,語意為「輸出參數」。
  • in (C# 7.2+):唯讀傳參考,避免大型結構複製開銷,防止意外修改。

總結

理解「變數儲存的是資料還是參考」是掌握 C# 參數傳遞的關鍵。實值型別複製資料,參考型別複製參考;ref/out/in 則控制「參考本身」是否可被替換。

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