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

C# 基礎概念 25 問:從語法到執行機制的深度解析

     編輯:關於C#

前言:面試與進階的必經之路

這 25 題涵蓋 C# 核心語法、記憶體模型、型別系統、執行機制。每題附帶標準答案、程式碼驗證與深度解析,適合面試準備與知識查漏補缺。

題目與解析

1. 靜態成員 vs 非靜態成員

差異:靜態屬於型別 (類別),非靜態屬於實例 (物件)。靜態在類別載入時建立,透過類別名存取;非靜態在實例化時建立,透過實例存取。靜態方法內不可直接使用非靜態成員。

class Demo { public static string S = "C"; public string I = "O"; }
Demo.S = "C#"; // 靜態
var d = new Demo(); d.I = "Obj"; // 非靜態

2. const vs static readonly

特性conststatic readonly
初始化時機編譯期執行期 (型別建構函式)
值儲存嵌入呼叫端 IL儲存於定義組件
修飾對象值型別、string任何型別
版本相容修改需重編譯呼叫端僅重編譯定義組件即可

3. extern 意義

聲明由外部實現的方法 (如 P/Invoke 呼叫 Win32 API),常搭配 [DllImport] 與 static 使用。不可與 abstract 共用。

4. abstract 意義

修飾類別/方法/屬性/事件/索引子,表示無實作 (抽象成員) 或不可實例化 (抽象類別)。不可與 static、virtual 共用。強制衍生類實作契約。

5. internal 修飾符

限定存取範圍為同一組件內。internal protected 為「同一組件 或 衍生類」 (邏輯 OR),非 AND。

6. sealed 修飾符

  • 類別:禁止繼承。
  • 方法/屬性:搭配 override 禁止進一步覆寫。
  • 效能:JIT 可內聯密封方法,略微提升效能。

7. override vs overload

  • override:覆寫基類虛擬成員 (多型)。
  • overload:同類別內同名不同參數簽章 (靜態綁定)。

8. 索引子

讓物件像陣列一樣用 obj[index] 存取。本質是帶參數的屬性,參數型別不限於 int。

9. new 修飾符

隱藏基類同名成員 (非覆寫)。僅用於衍生類。不可與 override 共用。修補基類設計缺失時使用。

10. this 關鍵字

  • 建構函式:呼叫同類別其他建構函式 (this(...))。
  • 實例成員:限定隱藏同名欄位/參數 (this.field = field)。
  • 索引子宣告:public int this[int i]。
  • 不可用於靜態內容。

11. 抽象方法可否覆寫虛擬方法?

可。需加 new abstract (隱藏) 或 override abstract (抽象覆寫,強制再衍生類實作)。

12. 密封類可有虛擬方法?

繼承而來的虛擬方法會隱性變為非虛擬;但密封類不能新增虛擬方法。

13. 屬性存取子

get/set 封裝欄位讀寫,實現封裝性。屬性不一定對應欄位 (可計算、驗證、事件觸發)。

14. abstract 能否與 virtual/override 共用?

不可與 virtual 共用;可與 override 共用 (抽象覆寫)。

15. 介面可包含成員

方法、屬性、索引子、事件。不可包含:欄位、常數、建構函式、解構函式、運算子、靜態成員 (C# 8 前)。

16. 類別 vs 結構

特性類別結構
型別分類參考型別 (堆疊)值型別 (堆疊/內嵌)
指派行為複製參考複製值 (新實例)
繼承支援不可繼承類別/結構,可實作介面
建構/解構皆有無預設無參建構函式,無解構函式
適用場景複雜物件、身分識別、大型資料輕量資料結構 (座標、矩形、日期)

17. 介面多重繼承問題

同名成員產生二義性。解決:顯式實作 (InterfaceName.Member)。

18. 抽象類別 vs 介面

  • 抽象類別:是什麼 (內部共性、部分實作、版本演進易)。
  • 介面:能做什麼 (外部契約、多重實作、解耦)。
  • 原則:預優先介面,需共享實作才用抽象類別。

19. 別名指示符

using Alias = Namespace.Type; 解決同名類型衝突或簡化冗長命名空間。作用域為檔案頂層或命名空間內部。

20. 手動釋放資源

實作 IDisposable 模式:Dispose(bool) + 解構函式 + GC.SuppressFinalize。適用非受控資源 (COM、Handle) 或大量實例需決定性釋放。

21. P/Invoke

受控與非受控代碼互操作 (平台調用服務)。透過 System.Runtime.InteropServices。每次轉換約 10-40 指令開銷,建議粗粒度調用 (一次調用多做事)。

22. StringBuilder vs String

  • String:不可變,運算產生新實例,堆疊配置。
  • StringBuilder:可變緩衝區,大量拼接/修改效能極佳。
  • 字串相等運算子 (==) 比較值 而非參考。

23. explicit vs implicit 轉換運算子

  • implicit:隱式轉換 (無資料遺失,如 int → long)。
  • explicit:顯式轉換 (可能遺失精度/範圍,需強制轉型 (T)x)。
  • 原則:能用 implicit 就用,有資料遺失風險才用 explicit。

24. params 關鍵字

方法參數陣列化,允許可變數量引數。只能出現一次且必須是最後一個參數。型別通常為 object[] 或具體型別陣列。

25. 反射

執行時期檢查/操作中繼資料 (組件、模組、型別、成員)。支援動態建立實例、呼叫方法、存取屬性/欄位。核心命名空間 System.Reflection。應用:外掛架構、序列化、ORM、動態代理、測試框架。效能成本高,熱路徑慎用或快取 MethodInfo。

總結

這 25 題串聯起 C# 的型別系統、記憶體管理、多型機制、元件模型與執行時互操作。深入理解每題背後的 設計動機 與 執行機制,比背誦答案更有價值。

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