C# 開發中將字串或其他類型轉為 int 時,常見 (int) 與 Convert.ToInt32() 兩種寫法。二者本質不同,適用場景與行為差異巨大。本文從類型系統、轉換語義、溢位處理、效能四大維度深度對比,助你精準選型。
| 維度 | (int) 強制轉換 | Convert.ToInt32() 內容轉換 |
|---|---|---|
| 本質 | 編譯期類型轉換(數值型之間) | 執行期內容解析(任意物件 → Int32) |
| 適用類型 | 僅限數值型(long, double, short, byte 等) | 支援任意型別(string, object, DateTime, bool 等) |
| 字串轉換 | 編譯錯誤(string 與 int 不相容) | 正確解析 數值字串 |
| 溢位行為 | 截斷高位(靜默錯誤,結果錯誤) | 拋出 OverflowException |
| null 處理 | 不適用 | 回傳 0(針對 null 參考) |
| 效能 | 極高(單指令) | 較低(含格式解析、檢查邏輯) |
double d = 3.14;
int i1 = (int)d; // 3,截斷小數
int i2 = Convert.ToInt32(d); // 3,銀行家四捨五入(MidpointRounding.ToEven)
long big = int.MaxValue + 100L;
int i3 = (int)big; // -2147483548(溢位截斷,極其危險)
int i4 = Convert.ToInt32(big); // 拋出 OverflowException(安全)
string s = "1412";
// int id = (int)s; // ❌ 編譯錯誤 CS0030:無法將 string 轉換為 int
int id = Convert.ToInt32(s); // ✅ 1412
int id2 = int.Parse(s); // ✅ 1412,僅限字串,效能略優
int id3 = int.TryParse(s, out var v); // ✅ 推薦:無例外、高效能、可判斷成功
object obj = "42";
int v1 = Convert.ToInt32(obj); // 42
// int v2 = (int)obj; // ❌ 編譯錯誤(需先 unbox 為 int 型別)
DateTime dt = DateTime.Now;
// int v3 = Convert.ToInt32(dt); // ❌ 拋出 InvalidCastException(不支援)
bool flag = true;
int v4 = Convert.ToInt32(flag); // 1
| 方法 | 適用場景 | 例外行為 | 效能 | 推薦度 |
|---|---|---|---|---|
int.Parse(s) |
確定字串合法、追求極致效能 | FormatException / ArgumentNullException | 最高 | ⭐⭐⭐⭐ |
int.TryParse(s, out v) |
不確定輸入、高頻呼叫、避免例外開銷 | 無(回傳 bool) | 高 | ⭐⭐⭐⭐⭐ 首選 |
Convert.ToInt32(s) |
通用物件轉換、需 null 回傳 0 語義 | FormatException / OverflowException | 中 | ⭐⭐⭐ |
int.TryParse(),次選 int.Parse(),避免 Convert 額外開銷。(int),必須用 Convert.ToInt32() 或手動檢查範圍後再轉。unbox 到確切數值型別,再用 (int) 或 Convert。reader.GetInt32() 或 Convert.ToInt32(reader["col"]) 處理 DBNull。(int) 是「型別斷言」,Convert.ToInt32() 是「內容解釋」。混淆二者是導致生產環境隱性 Bug 的高頻原因。牢記:字串只能 Parse/TryParse/Convert,數值縮小必須 Convert/檢查,效能敏感首選 TryParse。