四種轉換方式對比
| 方式 | 語法 | 適用場景 | 關鍵特性 |
| 強制轉型 | (int)val | 數值型別間轉換、拆箱 | 截斷小數、null 拋異常、char 轉 ASCII 碼 |
| Parse | int.Parse(str) | 字串轉數值 | null/空串拋異常、僅支援字串輸入 |
| Convert.ToXxx | Convert.ToInt32(val) | 通用型別轉換 | null 回 0、空串拋異常、四捨五入、char 轉 ASCII |
| TryParse | int.TryParse(str, out val) | 高效能安全轉換 | 不拋異常、回傳 bool 表示成敗、.NET 2.0+ |
詳細行為差異
強制轉型 (int)
- 浮點數**無條件捨去** (Truncate),非四捨五入
object 為 null 時拋 NullReferenceException
- 某些情況下
object 轉 int 不穩定
- 嚴禁用於 char:
(int)'9' 得 57 (ASCII),非 9
Parse 系列
- 僅接受
string 參數
null 或 string.Empty 均拋 ArgumentNullException/FormatException
- 各數值型別皆有靜態
Parse
Convert.ToXxx 系列
- 支援所有基礎型別、
null 安全 (回預設值 0/false)
- 陷阱:
string.Empty 轉數值仍拋異常
- 浮點數**四捨五入** (Banker's Rounding)
- 嚴禁用於 char:同強制轉型,回 ASCII 碼
TryParse (推薦)
- .NET 2.0 引入,效能最佳 (無異常開銷)
- 語義明確:
bool success = int.TryParse(s, out int v);
- 適用高頻率、可能失敗的轉換場景
實測程式碼範本
char c1 = '0', c2 = '9';
string sNull = null, s9 = "9", sEmpty = "";
int i1 = 0, i2 = 9;
double d1 = 1.2345, d2 = 1.5678;
object oNull = null, o9 = 9;
Console.WriteLine($"Cast: {(int)d1}, {(int)d2}"); // 1, 1 (截斷)
Console.WriteLine($"Parse: {int.Parse(s9)}"); // 9
Console.WriteLine($"Convert: {Convert.ToInt32(d1)}, {Convert.ToInt32(d2)}"); // 1, 2 (四捨五入)
Console.WriteLine($"TryParse: {int.TryParse(sEmpty, out _)}"); // False
金融/精度敏感系統建議
- 優先使用
TryParse 避免異常流控制
- 金額計算用
decimal,避免浮點誤差
- 明確業務規則:截斷 vs 四捨五入,統一使用
Math.Truncate/Math.Round
- 拒絕隱式轉換,所有邊界輸入显式驗證