int.Parse()遇到无效格式会抛出什么异常
int.parse()在输入为空、包含非数字字符或数值超出范围时,会分别抛出 argumentnullexception、formatexception 和 overflowexception。要封装一个不抛异常的转换方法,核心思路是使用 int.tryparse() 替代直接解析,并在转换失败时返回默认值(如 0)。

using System;
public class SafeParser
{
public static int ParseToInt(string input)
{
if (string.IsNullOrEmpty(input))
{
return 0;
}
if (int.TryParse(input, out int result))
{
return result;
}
return 0;
}
}
public class Program
{
public static void Main()
{
Console.WriteLine(SafeParser.ParseToInt("123")); // 输出: 123
Console.WriteLine(SafeParser.ParseToInt("abc")); // 输出: 0
Console.WriteLine(SafeParser.ParseToInt(null)); // 输出: 0
}
}
上述代码展示了完整的封装逻辑。首先检查输入是否为空,避免 TryParse 在某些极端情况下的潜在问题(尽管 TryParse 通常能处理 null,但显式检查更清晰)。接着调用 int.TryParse,如果成功则返回解析结果,否则返回 0。这种写法确保了无论输入如何,都不会抛出异常。
Convert.ToInt32()与int.Parse()在处理null时的区别是什么
Convert.ToInt32(null) 不会抛出异常,而是直接返回 0。而 int.Parse(null) 则会抛出 ArgumentNullException。因此,如果希望在不抛异常的前提下处理可能为 null 的字符串,使用 Convert.ToInt32() 是一种更简洁的选择,但它对格式错误的字符串仍然会抛出 FormatException。

using System;
public class ConvertParser
{
public static int ParseWithConvert(string input)
{
try
{
return Convert.ToInt32(input);
}
catch (FormatException)
{
return 0;
}
catch (OverflowException)
{
return 0;
}
}
}
public class Program
{
public static void Main()
{
Console.WriteLine(ConvertParser.ParseWithConvert(null)); // 输出: 0
Console.WriteLine(ConvertParser.ParseWithConvert("123")); // 输出: 123
Console.WriteLine(ConvertParser.ParseWithConvert("abc")); // 输出: 0
Console.WriteLine(ConvertParser.ParseWithConvert("9999999999")); // 输出: 0 (溢出)
}
}
这段代码演示了如何使用 Convert.ToInt32() 结合 try-catch 块来实现不抛异常的转换。虽然这种方法也能达到目的,但不如 int.TryParse() 高效,因为异常处理机制在性能上不如条件判断。此外,Convert.ToInt32() 的行为在某些边界情况下可能与预期不符,例如它会将空字符串转换为 0,而 int.Parse() 会抛出异常。
当输入为"0x1A"时,int.TryParse()会返回什么结果
当输入为 "0x1A" 时,int.TryParse() 默认不会识别十六进制格式,因此会返回 false,并设置输出参数为 0。如果需要支持十六进制解析,必须指定 NumberStyles.HexNumber 标志。
using System;
using System.Globalization;
public class HexParser
{
public static int ParseHexToInt(string input)
{
if (int.TryParse(input, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int result))
{
return result;
}
return 0;
}
}
public class Program
{
public static void Main()
{
Console.WriteLine(HexParser.ParseHexToInt("0x1A")); // 输出: 26
Console.WriteLine(HexParser.ParseHexToInt("1A")); // 输出: 26
Console.WriteLine(HexParser.ParseHexToInt("GHI")); // 输出: 0
}
}
此代码展示了如何在 int.TryParse() 中启用十六进制解析。通过传入 NumberStyles.HexNumber,解析器能够正确识别并转换十六进制字符串。如果不指定该标志,解析器将忽略前缀 "0x" 并将整个字符串视为十进制,导致解析失败。











