int.Parse()和Convert.ToInt32之间的主要区别是什么?

  • int.Parse()Convert.ToInt32()之间的主要区别是什么?
  • 哪一个是首选
  • 如果你有一个string,并且你希望它总是一个整数(比如说,如果某个web服务把一个string格式的整数交给你),你可以使用Int32.Parse()

  • 如果您正在收集用户的input信息,通常会使用Int32.TryParse() ,因为它允许您在用户input无效input时更好地控制情况。

  • Convert.ToInt32()将一个对象作为参数。 (见克里斯S的答案是如何工作的)

    如果Int32.Parse()方法的参数为null,则Convert.ToInt32()也不会引发ArgumentNullException 。 这也意味着Convert.ToInt32()可能比Int32.Parse()慢一点点,尽pipe在实践中,除非你在一个循环中Int32.Parse()的迭代,否则你永远不会注意到它。

看看reflection器:

int.Parse( “32”):

 public static int Parse(string s) { return System.Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo); } 

这是一个呼吁:

 internal static unsafe int ParseInt32(string s, NumberStyles style, NumberFormatInfo info) { byte* stackBuffer = stackalloc byte[1 * 0x72]; NumberBuffer number = new NumberBuffer(stackBuffer); int num = 0; StringToNumber(s, style, ref number, info, false); if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None) { if (!HexNumberToInt32(ref number, ref num)) { throw new OverflowException(Environment.GetResourceString("Overflow_Int32")); } return num; } if (!NumberToInt32(ref number, ref num)) { throw new OverflowException(Environment.GetResourceString("Overflow_Int32")); } return num; } 

Convert.ToInt32( “32”):

 public static int ToInt32(string value) { if (value == null) { return 0; } return int.Parse(value, CultureInfo.CurrentCulture); } 

正如第一个(Dave M)的评论所说的那样。

没有什么区别。
Convert.ToInt32() int.Parse()内部调用int.Parse()

除了一个参数为null Convert.ToInt32()返回0

否则,两者的工作方式相同

不同之处在于:

Int32.Parse()Int32.TryParse()只能转换string。 Convert.ToInt32()可以带任何实现IConvertible类。 如果你传递一个string,那么它们是等价的,只不过你会得到types比较的额外开销,等等。如果你正在转换string,那么TryParse()可能是更好的select。

int.Parse(string s)

  • RANGE中的整数>返回整数值
  • 空值> ArguementNullException
  • 不是格式> FormatException
  • 值不在RANGE> OverflowException中

Convert.ToInt32(string s)

  • RANGE中的整数>返回整数值
  • 空值>返回“0”
  • 不是格式> FormatException
  • 值不在RANGE> OverflowException中

bool isParsed = int.TryParse(string s,out res)

  • RANGE中的整数>返回整数值,isParsed = true
  • 空值>返回“0”,isParsed = false
  • 不格式>返回“0”,isParsed = false
  • 值不在RANGE>返回“0”,isParsed = false

试试下面的代码…..

 class Program { static void Main(string[] args) { string strInt = "24532"; string strNull = null; string strWrongFrmt = "5.87"; string strAboveRange = "98765432123456"; int res; try { // int.Parse() - TEST res = int.Parse(strInt); // res = 24532 res = int.Parse(strNull); // System.ArgumentNullException res = int.Parse(strWrongFrmt); // System.FormatException res = int.Parse(strAboveRange); // System.OverflowException // Convert.ToInt32(string s) - TEST res = Convert.ToInt32(strInt); // res = 24532 res = Convert.ToInt32(strNull); // res = 0 res = Convert.ToInt32(strWrongFrmt); // System.FormatException res = Convert.ToInt32(strAboveRange); //System.OverflowException // int.TryParse(string s, out res) - Test bool isParsed; isParsed = int.TryParse(strInt, out res); // isParsed = true, res = 24532 isParsed = int.TryParse(strNull, out res); // isParsed = false, res = 0 isParsed = int.TryParse(strWrongFrmt, out res); // isParsed = false, res = 0 isParsed = int.TryParse(strAboveRange, out res); // isParsed = false, res = 0 } catch(Exception e) { Console.WriteLine("Check this.\n" + e.Message); } } 

TryParse更快…

这些函数中的第一个函数Parse是任何.Net开发人员都应该熟悉的函数。 这个函数将接收一个string,并尝试从中提取一个整数,然后返回整数。 如果它遇到了无法parsing的东西,那么它会抛出一个FormatException,或者如果这个数字太大,会导致OverflowExceptionexception。 另外,如果你传递一个null值,它可以抛出一个ArgumentExceptionexception。

TryParse是新的.Net 2.0框架的新增function,它解决了原始分析函数的一些问题。 主要区别是exception处理非常慢,所以如果TryParse不能parsingstring,它不会像Parse那样抛出exception。 相反,它返回一个布尔值,指示它是否能够成功parsing数字。 所以你必须传递给TryParse这两个string被parsing和一个Int32输出参数来填写。我们将使用分析器来检查TryParse和Parse之间的速度差异,在这两种情况下,string可以正确parsing,该string不能被正确parsing。

Convert类包含一系列将一个基类转换为另一个的function。 我相信Convert.ToInt32(string)只是检查一个空string(如果string为空,它返回零不像parsing),然后只是调用Int32.Parse(string)。 我将使用分析器来确认这一点,并查看使用Convert而不是Parse对性能有什么实际影响。

来源与例子

希望这可以帮助。

Int32.parse(string)—>

Int32.Parse(string s)方法将数字的string表示forms转换为32位有符号整数等效forms。 当s是一个空引用时,它会抛出ArgumentNullException。 如果s不是整数值,则会抛出FormatException。 当s表示小于MinValue或大于MaxValue的数字时,将抛出OverflowException。 例如

 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 

Convert.ToInt32(string) – > Convert.ToInt32(string s)方法转换指定的32位有符号整数等价的string表示forms。 这依次调用Int32.Parse()方法。 当s是空引用时,它将返回0而不是抛出ArgumentNullException。 如果s不是整数值,则会抛出FormatException。 当s表示小于MinValue或大于MaxValue的数字时,将抛出OverflowException。

例如:

  result = Convert.ToInt32(s1); // 1234 result = Convert.ToInt32(s2); // FormatException result = Convert.ToInt32(s3); // 0 result = Convert.ToInt32(s4); // OverflowException 
 Convert.ToInt32 

有19个重载或19种不同的方式,你可以称之为。 也许在2010年的版本更多。

它将尝试从以下types转换;

Object,Boolean,Char,SByte,Byte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Single,Double,Decimal,String,Date

还有其他一些方法; 一个与数字基地和2个方法涉及System.IFormatProvider

另一方面parsing只有4个重载或4种不同的方式可以调用该方法。

 Integer.Parse( s As String) Integer.Parse( s As String, style As System.Globalization.NumberStyles ) Integer.Parse( s As String, provider As System.IFormatProvider ) Integer.Parse( s As String, style As System.Globalization.NumberStyles, provider As System.IFormatProvider ) 

这取决于参数types。 例如,我今天才发现它将使用ASCII值直接将char转换为int。 不完全是我想要的function…

你被警告了!

 public static int ToInt32(char value) { return (int)value; } Convert.ToInt32('1'); // Returns 49 int.Parse('1'); // Returns 1 

Convert.ToInt32允许空值,它不会抛出任何错误Int.parse不允许空值,它会抛出一个ArgumentNullException错误。

澄清开放控制台应用程序,只需复制下面的代码,并将其粘贴在static void Main(string[] args)方法,我希望你能理解

 public class Program { static void Main(string[] args) { int result; bool status; string s1 = "12345"; Console.WriteLine("input1:12345"); string s2 = "1234.45"; Console.WriteLine("input2:1234.45"); string s3 = null; Console.WriteLine("input3:null"); string s4 = "1234567899012345677890123456789012345667890"; Console.WriteLine("input4:1234567899012345677890123456789012345667890"); string s5 = string.Empty; Console.WriteLine("input5:String.Empty"); Console.WriteLine(); Console.WriteLine("--------Int.Parse Methods Outputs-------------"); try { result = int.Parse(s1); Console.WriteLine("OutPut1:" + result); } catch (Exception ee) { Console.WriteLine("OutPut1:"+ee.Message); } try { result = int.Parse(s2); Console.WriteLine("OutPut2:" + result); } catch (Exception ee) { Console.WriteLine("OutPut2:" + ee.Message); } try { result = int.Parse(s3); Console.WriteLine("OutPut3:" + result); } catch (Exception ee) { Console.WriteLine("OutPut3:" + ee.Message); } try { result = int.Parse(s4); Console.WriteLine("OutPut4:" + result); } catch (Exception ee) { Console.WriteLine("OutPut4:" + ee.Message); } try { result = int.Parse(s5); Console.WriteLine("OutPut5:" + result); } catch (Exception ee) { Console.WriteLine("OutPut5:" + ee.Message); } Console.WriteLine(); Console.WriteLine("--------Convert.To.Int32 Method Outputs-------------"); try { result= Convert.ToInt32(s1); Console.WriteLine("OutPut1:" + result); } catch (Exception ee) { Console.WriteLine("OutPut1:" + ee.Message); } try { result = Convert.ToInt32(s2); Console.WriteLine("OutPut2:" + result); } catch (Exception ee) { Console.WriteLine("OutPut2:" + ee.Message); } try { result = Convert.ToInt32(s3); Console.WriteLine("OutPut3:" + result); } catch (Exception ee) { Console.WriteLine("OutPut3:" + ee.Message); } try { result = Convert.ToInt32(s4); Console.WriteLine("OutPut4:" + result); } catch (Exception ee) { Console.WriteLine("OutPut4:" + ee.Message); } try { result = Convert.ToInt32(s5); Console.WriteLine("OutPut5:" + result); } catch (Exception ee) { Console.WriteLine("OutPut5:" + ee.Message); } Console.WriteLine(); Console.WriteLine("--------TryParse Methods Outputs-------------"); try { status = int.TryParse(s1, out result); Console.WriteLine("OutPut1:" + result); } catch (Exception ee) { Console.WriteLine("OutPut1:" + ee.Message); } try { status = int.TryParse(s2, out result); Console.WriteLine("OutPut2:" + result); } catch (Exception ee) { Console.WriteLine("OutPut2:" + ee.Message); } try { status = int.TryParse(s3, out result); Console.WriteLine("OutPut3:" + result); } catch (Exception ee) { Console.WriteLine("OutPut3:" + ee.Message); } try { status = int.TryParse(s4, out result); Console.WriteLine("OutPut4:" + result); } catch (Exception ee) { Console.WriteLine("OutPut4:" + ee.Message); } try { status = int.TryParse(s5, out result); Console.WriteLine("OutPut5:" + result); } catch (Exception ee) { Console.WriteLine("OutPut5:" + ee.Message); } Console.Read(); } }