为什么我们需要太多执行相同功能的方法?

时间:2010-09-10 20:07:27

标签: c#

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 

From this link

当操作的意图是将字符串转换为int时,为什么我们需要这么多转换函数。

如果我的问题很愚蠢,我很抱歉。

4 个答案:

答案 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方法,我几乎不会说他们执行相同的工作!

另见this link