本系列針對 Java 開發者,系統對比 C# 與 Java 的異同。上篇涵蓋:原始檔慣例、命名空間 vs 套件、資料類型、列舉、字串處理、轉型規則、值/參考類型、裝箱拆箱、運算子、流程控制、存取修飾詞、建構函式、Main 入口點、參數傳遞、屬性、結構、陣列、繼承基礎。
| 項目 | Java | C# |
|---|---|---|
| 副檔名 | .java | .cs |
| 單檔多 public 類別 | 不允許 | 允許 |
| 檔名必須符合類別名 | 是 | 否 |
| 套件/命名空間關鍵字 | package | namespace |
| 匯入/引用關鍵字 | import | using |
| 單檔多命名空間 | 不允許 | 允許 |
C# using 可建立別名:using Short = Long.Namespace.Name;
C# 所有基本類型均為 System 命名空間結構體,提供別名:
| C# 別名 | .NET 類型 | 寬度 | 備註 |
|---|---|---|---|
| sbyte | System.SByte | 8 位 | 有號 |
| byte | System.Byte | 8 位 | 無號 |
| short | System.Int16 | 16 位 | |
| ushort | System.UInt16 | 16 位 | 無號 |
| int | System.Int32 | 32 位 | |
| uint | System.UInt32 | 32 位 | 無號 |
| long | System.Int64 | 64 位 | |
| ulong | System.UInt64 | 64 位 | 無號 |
| float | System.Single | 32 位 | |
| double | System.Double | 64 位 | |
| decimal | System.Decimal | 128 位 | 高精度財務計算 |
| char | System.Char | 16 位 | Unicode |
| bool | System.Boolean | Java 為 boolean |
基本類型可直接呼叫方法:int i=10; i.ToString();(自動裝箱)。
C# 支援 enum(Java 1.5 前無):
public enum Color { Green, Orange, Red, Blue }
public enum ColorValue { Green=10, Orange=20, Red=30, Blue=40 }
Color fav = Color.Blue;
Console.WriteLine((int)fav); // 輸出 3 或 40
==/!= 比較值(Java 需 equals())@"C:\Path\File.txt" 免轉義(Java 無對應)System.Text.StringBuilder(對應 Java StringBuffer)隱式擴展轉換(如 int → long)、顯式縮小轉換((int)longVar)規則與 Java 相同。C# 額外提供 checked/unchecked 控制溢位檢查。
struct、enum。變數直接包含資料,指派會複製。class、interface、delegate、陣列。變數存放參考,指派複製參考指向同一物件。裝箱/拆箱:值類型 ↔ 參考類型(object)轉換。C# 自動處理;Java 需手動包裝/解包裝類別。
checked/unchecked(溢位控制)、is(型別檢查)、sizeof(需 unsafe)、typeof/GetType()(反射)>>>(無號右移),C# 靠無號類型 + >> 達成switch:C# 禁止 fall-through,每個 case 必須以 break/goto 結束;支援字串 caseforeach:C# 獨有,遍歷 IEnumerable(Java 1.5 引入 for-each)goto:C# 保留並可用(Java 保留未實作)| 修飾詞 | C# | Java |
|---|---|---|
| public | 全域可見 | 全域可見 |
| protected | 衍生類可見 | 同套件+衍生類 |
| private | 類別內可見 | 類別內可見 |
| internal | 同組件可見 | 無對應(套件可見) |
| protected internal | 同組件或衍生類 | 無對應 |
C# 預設 private,Java 預套件可見。sealed 對應 Java final(類別不可繼承)。readonly(執行期初始化)對應 final(編譯期常數)。
Main() 大寫開頭,回傳 int/void,可選 string[] argsref(需初始化)、out(不需初始化、方法內必指派)實現傳參考params 可變參數:void Avg(string title, params int[] vals)屬性(get/set 存取子)封裝欄位存取。結構(struct)為值類型,不可繼承、無預設建構函式覆寫、預設欄位自動歸零。
// C# 方括號在類型後
int[] arr = new int[5];
int[] arr = {1,2,3,4,5}; // 初始化器數量必符合大小
// 多維陣列(矩形)
int[,] matrix = new int[5,4];
matrix[4,3] = 906;
// 交錯陣列
int[][] jagged = new int[2][];
jagged[0] = new int[4];
jagged[1] = new int[3];
System.Array 提供 Sort()、Reverse() 等靜態方法。
C# 以冒號同時表達繼承類別與實作介面:class Derived : Base, IInterface。基類必須在最左。不支援多重繼承。
public class Point { /* x, y, X, Y 屬性 */ }
public class ColorPoint : Point { /* 新增 ScreenColor 屬性 */ }
下篇將深入建構函式鏈結、方法覆寫、抽象類別、介面、運算子多載、例外、索引子、屬性、委派/事件、GC、unsafe 程式碼等進階主題。