C# 與 Java 同屬強型別、物件導向、受控執行環境語言,但 20 年演進下在**設計哲學、語言特性、執行階段、工具鏈**上形成鮮明差異。本文從 8 個維度深度比較,作為技術選型與跨語言遷移參考。
| 概念 | C# | Java |
|---|---|---|
| 命名空間 | namespace | package |
| 引用 | using | import |
| 主程式 | static void Main(string[] args) (4 種多載) | public static void main(String[] args) |
| 標準輸出 | Console.WriteLine() | System.out.println() |
| 標準輸入 | Console.ReadLine() | Scanner.nextLine() |
| 類別檔案限制 | 無限制 | public 類別名 = 檔名 |
struct (值類型) / class (參考類型) 統一物件模型,int 等為結構體別名,支援使用者自訂值類型、readonly struct、ref struct。object/介面發生封箱 (堆積配置),泛型可避免。int → Integer)。| 特性 | C# (Reified Generics) | Java (Type Erasure) |
|---|---|---|
| 執行期型別資訊 | 保留完整 (List<int> ≠ List<string>) | 抹除為原始型別 (List<Integer> → List) |
| 值類型支援 | 原生 List<int> 零封箱 | 僅包裝類別 List<Integer> 有封箱 |
| 執行期建立 | typeof(T), new T() (where T:new()) | 需工廠/反射 |
| 變異性 | in/out (宣告點) | ? extends/? super (使用點) |
delegate 一級型別、多播、event 關鍵字語言級支援、+=/-= 訂閱語法。| 模式 | C# | Java |
|---|---|---|
| 核心抽象 | Task/Task<T> | CompletableFuture<T> / Future<T> |
| 語法糖 | async/await (編譯器狀態機) | 鏈式 API / 虛擬執行緒 (Project Loom, Java 21+) |
| 取消機制 | CancellationToken 協作式 | Future.cancel(true) 中斷執行緒 |
property (get/set)、indexer (this[int i]) 語言原生支援,編譯為 get_/set_ 方法。getX()/setX(),無索引子語法 (需 get(i)/set(i, v))。| 維度 | .NET (CLR) | JVM |
|---|---|---|
| 跨平台 | .NET 6+ 原生支援 Win/Linux/macOS, x64/ARM64 | 自誕生即跨平台 |
| 原生互操作 | DllImport/NativeAOT 極簡單 | JNI/JNA/Panama 較繁瑣 |
| 建置工具 | dotnet CLI 一體化 (建置/測試/NuGet/Docker) | Maven/Gradle + 獨立 IDE |
| 語言演進 | 每年大版本 (C# 12/13),激進新特性 | 6 個月釋出,LTS 週期長 (8/11/17/21) |
| AOT 編譯 | NativeAOT 成熟支援 | GraalVM Native Image 較成熟 |
| 選擇 C# 當 | 選擇 Java 當 |
|---|---|
| Windows 桌面 (WPF/WinForms/MAUI) | 企業級伺服器端傳統強項 (Spring Boot) |
| Unity 遊戲開發 | Android 原生開發 (Kotlin 為主) |
| .NET 生態 (ASP.NET Core, EF Core, Blazor) | 超大型團隊長期維護、嚴格向後相容 |
| 需高效能值類型/泛型/原生互操作 | JVM 監控/分析工具成熟 (JFR, Arthas) |
| 偏好現代語法糖 (Record, Pattern Matching) | 大數據生態 (Hadoop, Spark, Flink) |
| C# | Java 對應 | 注意 |
|---|---|---|
async/await | CompletableFuture / Virtual Threads | 非直接對應,需重構控制流 |
LINQ | Stream API | 語法不同,表達力相近 |
property | get/set 方法 | 框架 (Jackson, JPA) 依賴慣例 |
delegate/event | Functional Interface + Listener | 架構模式不同 |
struct | 無直接對應 (Valhalla 預覽) | 記憶體佈局控制無法直接移植 |
NativeAOT | GraalVM Native Image | 工具鏈差異大 |