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

时间:2008-10-13 23:48:34

标签: c#

  • int.Parse()Convert.ToInt32()之间的主要区别是什么?
  • 哪一个是首选的

13 个答案:

答案 0 :(得分:413)

  • 如果您有一个字符串,并且您希望它始终是一个整数(例如,如果某个Web服务正在以字符串格式处理整数),则使用Int32.Parse()

  • 如果您正在收集用户的输入,您通常会使用Int32.TryParse(),因为它允许您在用户输入无效输入时对情况进行更精细的控制。

  • Convert.ToInt32()以对象为参数。 (参见Chris S关于它是如何工作的答案)

    Convert.ToInt32()的参数为ArgumentNullException时,

    Int32.Parse()也不会抛出Convert.ToInt32()。这也意味着Int32.Parse()可能比{{1}}慢一点,但在实践中,除非你在循环中进行了大量的迭代,否则你永远不会注意到它。

答案 1 :(得分:175)

看一下反射器:

<强> 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's)评论说。

答案 2 :(得分:73)

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

当参数为Convert.ToInt32()时,0只返回null

否则两者都以相同的方式工作

答案 3 :(得分:27)

int.Parse(string s)

  • RANGE中的整数&gt;返回整数值
  • 空值&gt; ArguementNullException
  • 不是格式&gt;出现FormatException
  • 值不在RANGE&gt;发生OverflowException

Convert.ToInt32(string s)

  • RANGE中的整数&gt;返回整数值
  • 空值&gt;返回&#34; 0&#34;
  • 不是格式&gt;出现FormatException
  • 值不在RANGE&gt;发生OverflowException

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

  • RANGE中的整数&gt;返回整数值,isParsed = true
  • 空值&gt;返回&#34; 0&#34;,isParsed = false
  • 不是格式&gt;返回&#34; 0&#34;,isParsed = false
  • 值不在RANGE&gt;返回&#34; 0&#34;,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);
        }
    }

答案 4 :(得分:21)

区别在于:

Int32.Parse()Int32.TryParse()只能转换字符串。 Convert.ToInt32()可以使用任何实现IConvertible的类。如果你传递一个字符串,那么它们是等价的,除了你为类型比较等获得额外的开销。如果你要转换字符串,那么TryParse()可能是更好的选择。

答案 5 :(得分:8)

TryParse更快......

  

这些功能中的第一个,Parse,应该是熟悉的   任何.Net开发人员。此函数将采用字符串并尝试   从中提取一个整数然后返回整数。如果它运行   进入无法解析的东西然后抛出FormatException或   如果数量太大,则出现OverflowException。而且,它可以抛出一个   ArgumentException,如果你传递一个空值。

     

TryParse是新的.Net 2.0框架的新增功能,它解决了原始Parse功能的一些问题。主要的   区别在于异常处理非常慢,所以如果TryParse是   无法解析字符串,它不像Parse那样抛出异常   确实。相反,它返回一个布尔值,表明它是否能够   成功解析一个数字。所以你必须将两者都传递给TryParse   要解析的字符串和要填写的Int32 out参数。我们将   使用探查器检查TryParse和之间的速度差异   在两种情况下解析可以正确解析字符串的情况   无法正确解析字符串的情况。

     

Convert类包含一系列将一个基类转换为另一个基类的函数。我相信   Convert.ToInt32(string)只检查一个空字符串(如果是字符串   为null,它返回零,与Parse不同)然后只是调用   Int32.Parse(串)。我将使用分析器来确认并查看   如果使用Convert而不是Parse有任何实际影响   性能

Source with examples

希望这有帮助。

答案 6 :(得分:7)

<强> Int32.parse(字符串)---&GT;

Int32.Parse(string s)方法将数字的字符串表示形式转换为其等效的32位有符号整数。当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) - &gt; Convert.ToInt32(string s)方法转换32位有符号整数等效的指定字符串表示形式。这反过来调用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 

答案 7 :(得分:4)

Convert.ToInt32

有19种重载或19种不同的方式可以调用它。在2010版本中可能更多。

它将尝试从以下TYPES转换;

  
    

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

  

它还有许多其他方法;一个与数字基数有关,两个方法涉及System.IFormatProvider

另一方面,Parse只有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 )

答案 8 :(得分:2)

取决于参数类型。例如,我今天刚刚发现它将使用ASCII值将char直接转换为int。不完全是我想要的功能......

你已经被警告了!

public static int ToInt32(char value)
{
    return (int)value;
} 

Convert.ToInt32('1'); // Returns 49
int.Parse('1'); // Returns 1

答案 9 :(得分:2)

以下是int.ParseConvert.ToInt32的详细信息: 比如说,你有一个char数组char[] a=['1','2','3','4'],并希望将每个元素转换为整数。 Convert.ToInt32(a[0])将为您提供49个数字。它将其视为ASCII代码 int.Parse(a[0])将为您提供正确的输出,即1

如果你有一个字符串数组string[] b=['1','2','3','4'],那么Convert.ToInt32int.Parse的输出没有区别。两者都返回正确的整数。

答案 10 :(得分:1)

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

答案 11 :(得分:1)

澄清打开控制台应用程序,只需复制下面的代码并将其粘贴到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();
        }
    }

答案 12 :(得分:0)

Parse()方法提供了不能用于​​Convert()的数字样式。例如:

int i;
bool b = int.TryParse( "123-",
           System.Globalization.NumberStyles.AllowTrailingSign,
           System.Globalization.CultureInfo.InvariantCulture,
           out i);

将使用后缀符号解析数字,以便i == -123
尾随符号在ERP系统中很流行。