在C#中做类型转换,尤其是字符串转整数时,
int.Parse()和
Convert.ToInt32()看起来功能相似,但它们的处理逻辑、适用场景和异常行为有明显区别。选错方法容易导致程序崩溃或隐藏bug。
int.Parse():严格解析,空值直接报错
int.Parse()只接受非 null、格式正确的字符串,内部调用的是
Number.ParseInt32()。它不处理 null 或空白字符串,遇到就抛出
ArgumentNullException或
FormatException。 输入为
null→ 抛出
ArgumentNullException输入为
""或
" "(纯空白)→ 抛出
FormatException输入为
"123"、
"-456"→ 正常返回对应整数 输入为
"12.3"、
"abc"→ 抛出
FormatException
Convert.ToInt32():更宽容,自动处理 null 和部分类型
Convert.ToInt32()是一个“通用转换器”,底层会先判断参数类型再分发处理。对字符串,它内部其实也调用了
int.Parse(),但多了一层 null 判断: 输入为
null→ 返回
0(不会报错) 输入为
""→ 抛出
FormatException(和 Parse 一样) 输入为
" 789 "→ 成功返回
789(会自动 Trim) 输入为
double、
long、
bool等其他类型 → 尝试转换(比如
true → 1)
更安全的选择:int.TryParse()
生产代码中,**强烈推荐优先使用
int.TryParse()**。它不抛异常,而是通过返回
bool表示是否成功,并用
out参数输出结果: 成功时返回
true,并把值写入 out 变量 失败时返回
false,out 变量为
0(不会影响原有变量) 适合用户输入、配置读取等不可控来源 示例:
if (int.TryParse("123", out int result)) { Console.WriteLine(result); } // 输出 123if (int.TryParse("abc", out int x)) { /* 不会执行 */ } else { Console.WriteLine("转换失败"); }
什么时候该用哪个?
确定字符串一定合法且非 null → 可用int.Parse()(语义明确) 输入可能为 null,但你希望 null 转成 0 → 用
Convert.ToInt32()输入来源不可靠(如 TextBox、JSON、文件)→ 必须用
int.TryParse()需要自定义格式(如带千分位、不同文化习惯)→ 用
int.Parse(string, IFormatProvider)或
TryParse的重载
基本上就这些。别被名字迷惑——
Convert并不比
Parse“更高级”,只是职责不同;而
TryParse才是日常最实用、最健壮的选择。
