string s1 = "1234";
string s2 = "1234.65";
string s3 = null;
string s4 = "123456789123456789123456789123456789123456789";
result = Int32.Parse(s1); //-- 1234
result = Int32.Parse(s2); //-- FormatException
result = Int32.Parse(s3); //-- ArgumentNullException
result = Int32.Parse(s4); //-- OverflowException
result = Convert.ToInt32(s1); //-- 1234
result = Convert.ToInt32(s2); //-- FormatException
result = Convert.ToInt32(s3); //-- 0
result = Convert.ToInt32(s4); //-- OverflowException
success = Int32.TryParse(s1, out result); //-- success => true; result => 1234
success = Int32.TryParse(s2, out result); //-- success => false; result => 0
success = Int32.TryParse(s3, out result); //-- success => false; result => 0
success = Int32.TryParse(s4, out result); //-- success => false; result => 0
当操作的意图是将字符串转换为int时,为什么我们需要这么多转换函数。
如果我的问题很愚蠢,我很抱歉。
答案 0 :(得分:13)
他们做了3件不同的事情:
Int32.Parse()
需要一个字符串,它是整数的精确表示。它非常有限 - 要么解析字符串要么爆炸。
Int32.TryParse()
与Parse相同,但具有执行验证的额外开销。因此,如果您不确定传入的字符串是否可解析,则优于Parse
并捕获异常(非常昂贵)。但是TryParse
在您可以对单Parse
会非常自信的情况下是浪费的。
Convert.ToInt32
是最复杂的 - 它实际上确定传入的对象是 convertible ,而不是可解析的,是否为int。它支持在许多本机(已知)类型之间进行转换,但也检查传入对象以查看对象是否通过IConvertible
提供自己的逻辑,实质上是说“是的,我可以转换为整数 - 这是如何”。 / p>
答案 1 :(得分:1)
每种方法都有性能折衷。
例如,TryParse不会抛出异常,所以如果你必须快速进行大量转换,你应该使用该方法,然后检查null,这样你就可以通过性能命中来实例化异常并捕获它。
答案 2 :(得分:1)
它们并非完全相同,它们的行为略有不同。
例如 - 如果格式不正确,TryParse
模式将不会抛出异常,Try
将会出现。
关于Convert
vs Parse
- 转换会在引擎盖下调用Parse
,并附加检查传入null
(如果null
传入,则返回0传入{{1}}。
答案 3 :(得分:0)
对于Int32.Parse,您刚刚提供了four overloads之一。这会改变视角。
也许Int32.Parse回调转换方法。但Convert也是简单解析方法的单独集合。由于异常是相同的,我想它可能会调用转换方法。
至于TryParse方法,我几乎不会说他们执行相同的工作!