本文梳理 C# 基礎但關鍵的語言機制:本地變量 vs 字段、var 類型推斷、參數傳遞模式、屬性本質、對象初始化語法、this 用法,助力面試複習與日常開發避坑。
| 維度 | 實例字段 | 本地變量 |
|---|---|---|
| 生存期 | 對象創建 ~ 對象不可達 (GC 回收) | 聲明點 ~ 代碼塊結束 |
| 隱式初始化 | 默認值 (0/null/false) | **無**,使用前必須賦值,否則編譯錯誤 |
| 存儲位置 | 堆 (對象內部) | 值類型→棧;引用類型→引用在棧,對象在堆 |
var 隱式類型變量var i = 10; // int
var s = "hello"; // string
var list = new List(); // List
// 編譯期推斷,運行期無開銷,不可用於字段/屬性/返回值,僅限本地變量
| 模式 | 關鍵字 | 機制 | 適用場景 |
|---|---|---|---|
| 值傳遞 | (無) | 複製值/引用到形參 | 默認,不可修改實參 |
| 引用傳遞 | ref | 形參成爲實參別名,指向同一內存 | 需修改實參值類型、或交換引用 |
| 輸出參數 | out | 類似 ref,但**不要求實參預先賦值**,方法內**必須**賦值 | TryParse 模式、多返回值 |
| 只讀引用 | in (C# 7.2+) | 引用傳遞但禁止修改,編譯器強制 | 大結構體傳遞避免複製,保證不可變 |
// out 示例
bool TryParse(string s, out int result) {
result = 0; // 必須賦值
return int.TryParse(s, out result);
}
auto-property 產生隱私字段)。set 內隱含參數 value,類型與屬性同,返回 void。get 無參數,返回屬性類型。public int Id { get; private set; }。class Point { public int X, Y, Z; public Point(int z) { Z = z; } }
var p1 = new Point(); // X=0,Y=0,Z=0
var p2 = new Point { X=4, Y=5, Z=6 }; // 無構造函數參數
var p3 = new Point(9) { X=7, Y=8 }; // 有構造函數參數,括號可省略 new Point(9) { ... }
this 關鍵字this.name = name;OtherService.Register(this);return this;this(...) 調用本類其他構造函數。ref 双向、out 单向輸出、in 只讀引用。this 指當前、靜態不用、區分同名、傳自己。夯實基礎,才能在泛型、委託、異步、Span、Source Generator 等進階特性上行穩致遠。