25 題完整列表與核心答案摘要
- 靜態 vs 非靜態成員:靜態屬於類別,實例屬於物件;靜態方法不可存取非靜態成員
- const vs static readonly:編譯期內嵌 vs 執行期讀取;跨組件更新行為不同
- extern:宣告外部實作(如
DllImport、MethodImplOptions.InternalCall)
- abstract:抽象類別/成員,強制衍生實作,不可與 static/virtual 共存
- internal:組件內可見,跨組件不可見;搭配
InternalsVisibleTo 友元組件
- sealed:密封類別禁止繼承、密封成員禁止覆寫
- override vs overload:重寫(多型) vs 多載(同名不同參數)
- 索引子:帶參數屬性,參數型別不限 int,支援多載
- new 修飾詞:隱藏基底成員,非多型,編譯器預設警告
- this:實例參考,建構函式鏈結、索引子、流式介面、結構體語意不同
- abstract override:抽象覆寫基底虛擬方法,保留多型槽位
- 密封類別虛擬方法:可繼承基底虛擬,不可宣告新虛擬
- 屬性存取器:get/set 封裝欄位,可異存取修飾詞,不一定對應欄位
- abstract + virtual/override:abstract 不可與 virtual 共存,可與 override 共存(抽象覆寫)
- 介面成員:方法/屬性/事件/索引子;無欄位/建構函式/靜態(C#8前)
- 類別 vs 結構體:參考/值型別、堆積/堆疊、繼承/不可繼承、指派語意
- 介面多重繼承問題:同名成員衝突→顯式實作解決;菱形繼承無問題(無實作)
- 抽象類別 vs 介面:共用實作/狀態用抽象類,契約/多重實作用介面
- 別名指示符
using Alias = Type; 解決命名衝突、簡化泛型名稱
- IDisposable 模式:Dispose/Finalizer/GC.SuppressFinalize,SafeHandle 現代替代
- P/Invoke:受控呼叫非受控,轉換開銷大,批次化減少呼叫
- StringBuilder vs String:可變緩衝區 vs 不變字串,大量拼接必用 SB
- implicit vs explicit:隱式安全轉換 vs 顯式可能遺失資料轉換
- params:可變參數陣列,最後一個參數,編譯器產生 newarr
- 反射:執行期檢查/操作中繼資料,動態實例化/呼叫,插件/ORM/DI 基石
第 1 題詳細解析:靜態 vs 非靜態
using System;
class Demo {
public static string StaticField = "Class";
public string InstanceField = "Object";
}
class Program {
static void Main() {
Console.WriteLine($"Static: {Demo.StaticField}"); // 類別存取
var o1 = new Demo { InstanceField = "Obj1" };
var o2 = new Demo { InstanceField = "Obj2" };
Console.WriteLine($"o1: {o1.InstanceField}"); // 物件存取
Console.WriteLine($"o2: {o2.InstanceField}");
Console.ReadKey();
}
}
學習建議
- 逐題動手寫對應範例程式,觀察輸出與 IL
- 重點掌握:記憶體模型、多型機制、版本相容、資源管理
- 面試高頻:2, 6, 7, 10, 15, 16, 20, 22, 25
- 進階延伸:
readonly struct、ref struct、Span<T>、Source Generators
原文參考
本系列源自博客園「C#基礎概念二十五問」專欄,經整理補充現代 .NET 最佳實踐。