C# 是微軟設計的現代、通用、物件導向程式語言,運行於 .NET 執行環境。結合了 C/C++ 的效能與 Java 的生產力,並引入許多創新特性。本文系統性介紹 C# 的核心語言特性、型別系統、記憶體管理、非同步程式設計等關鍵能力。
| 特性 | 值型別 (struct) | 參考型別 (class) |
| 儲存位置 | 堆疊 | 堆積 |
| 指派語意 | 複製值 | 複製參考 |
| 預設值 | 零初始化 | null |
| 繼承 | 不可繼承 (可實作介面) | 單一繼承 |
| 範例 | int, double, DateTime, 自訂 struct | string, array, class, delegate |
Nullable<T> (簡寫 T?) 讓值型別可表示 null。
3. 泛型:型別安全的程式碼重用
public class Repository<T> where T : class, new() {
public T GetById(int id) { ... }
public void Add(T entity) { ... }
}
// 使用
var userRepo = new Repository<User>();
var orderRepo = new Repository<Order>();
執行時期具現化,避免 boxing/unboxing,效能優於非泛型集合。
4. LINQ:語言整合查詢
var activeUsers = users
.Where(u => u.IsActive)
.OrderBy(u => u.LastLogin)
.Select(u => new { u.Name, u.Email })
.ToList();
支援記憶體集合、資料庫 (Entity Framework)、XML、JSON 等多種資料源,編譯期語法檢查、IntelliSense 完整支援。
5. 非同步程式設計:async/await
public async Task<User> GetUserAsync(int id) {
using var http = new HttpClient();
var json = await http.GetStringAsync($"/api/users/{id}");
return JsonSerializer.Deserialize<User>(json);
}
編譯器自動生成狀態機,避免封鎖執行緒,大幅提升 I/O 密集型應用吞吐量。
6. 委派與事件:型別安全的回呼機制
public delegate void PriceChangedHandler(decimal oldPrice, decimal newPrice);
public class Stock {
public event PriceChangedHandler PriceChanged;
private decimal _price;
public decimal Price {
get => _price;
set {
if (_price != value) {
var old = _price;
_price = value;
PriceChanged?.Invoke(old, value);
}
}
}
}
7. 屬性與索引器:封裝存取邏輯
public class Person {
private string _name;
public string Name {
get => _name;
set => _name = value?.Trim() ?? throw new ArgumentNullException();
}
// 索引器
public string this[string key] {
get => key switch {
"name" => Name,
_ => throw new KeyNotFoundException()
};
}
}
8. 模式比對與切換運算式 (C# 7+)
public static string Describe(object obj) => obj switch {
int i when i > 0 => $"Positive integer: {i}",
int i when i < 0 => $"Negative integer: {i}",
string s when s.Length > 10 => "Long string",
string s => $"String: {s}",
null => "Null",
_ => "Unknown"
};
9. 記錄型別 (C# 9+):不可變資料載體
public record Person(string FirstName, string LastName, int Age);
// 值相等性、with 運算式、解構內建支援
var p1 = new Person("John", "Doe", 30);
var p2 = p1 with { Age = 31 }; // 複製並修改
10. 原始產生器與來源產生器 (C# 9+)
編譯期生成程式碼,用於序列化、DI 容器、gRPC 等樣板碼消除,零執行期額外負擔。
進階特性速覽
| 特性 | 版本 | 用途 |
| Nullable Reference Types | C# 8 | 編譯期 null 安全性分析 |
| 預設介面方法 | C# 8 | 介面演進不破壞實作 |
| 區域函式 | C# 7 | 方法內嵌輔助函式 |
| 元組與解構 | C# 7 | 多返回值、輕量資料分組 |
| ref struct / Span<T> | C# 7.2 | 高效能記憶體切片、零複製 |
| 模式比對增強 | C# 8/9 | 型別、屬性、關係、邏輯模式 |
| Init-only 屬性 | C# 9 | 物件初始化後不可變 |
| 檔案區域型別 | C# 11 | 限制型別可見範圍 |
| Required 成員 | C# 11 | 強制物件初始化契約 |
| Primary Constructors | C# 12 | 簡化類別/結構體建構 |
C# vs Java vs C++ 關鍵差異
| 維度 | C# | Java | C++ |
| 記憶體管理 | GC | GC | 手動/智慧指標 |
| 泛型實作 | 執行期具現化 | 型別擦除 | 編譯期模板具現化 |
| 屬性/事件 | 內建語法 | 慣例命名 | 無/庫實作 |
| 非同步 | async/await | CompletableFuture | coroutines (C++20) |
| 值型別 | struct 完整支援 | 無 (Primitive/Valhalla) | 完整支援 |
| 運算子多載 | 支援 | 不支援 | 支援 |
| 平台綁定 | .NET (跨平台) | JVM (跨平台) | 原生 (跨平台編譯) |
總結
C# 擁有現代語言最完整的特性集:強型別、GC、泛型、LINQ、async/await、模式比對、記錄型別等,並持續快速演進。配合 .NET 生態系的高效能執行時、豐富類別庫、優秀工具鏈,是企業級應用、雲原生服務、遊戲開發、桌面應用的首選語言之一。
- 上一篇文章: C# 開發環境完整指南:.NET Framework、IDE 與跨平台選項
- 下一篇文章: C# 與 Java 技術深度評析:殊途同歸中的關鍵差異
Copyright ©
程式碼之家 All Rights Reserved