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

580
  • int.Parse()Convert.ToInt32()的主要区别是什么?
  • 哪个更被推荐使用?
14个回答

513
  • 如果你有一个字符串,而你期望它总是一个整数(比如说,如果一个Web服务以字符串格式提供给你一个整数),那么你可以使用 Int32.Parse()

  • 如果你从用户收集输入的话,通常会使用 Int32.TryParse(),因为它允许你更细致地控制当用户输入无效时的情况。

  • Convert.ToInt32() 接受一个对象作为参数。(请参见Chris S的答案,了解它的工作原理)

    Convert.ToInt32() 也不像Int32.Parse()那样在其参数为空时抛出ArgumentNullException。 这也意味着 Convert.ToInt32() 可能比 Int32.Parse() 稍微慢一点,但实际上,除非您在循环中执行大量迭代,否则您永远不会注意到这一点。


57
正如其他人指出的那样,Convert.ToInt32(s)在s为null时不会抛出异常,但是Parse()会。 "稍微慢一点"完全不重要,因为你永远无法测量出差异。 - Robert Paulson
5
谢谢,罗伯特!我正在编辑我的回答,以使其更完整。但就性能而言,如果你在嵌套循环中调用它,我敢打赌速度差异会是可检测的... - Dave Markle
6
实际上,由于ToInt32方法有许多类型的重载,其中包括System.String,因此不需要浪费时间来确定类型。实际代码仅对空值返回0,并对其他所有值执行int.Parse(value, CultureInfo.CurrentCulture) - Andreas Eriksson
6
在文档的“返回值”部分中:“一个等同于值的数字的32位有符号整数,如果值为 null,则为 0(零)。” - Dave Markle
3
请在“Convert.ToInt32()”中删除有关“Int32.TryParse()”的提及,因为这是错误的。如果字符串格式不正确,“Convert”会引发异常。 - Dehalion
显示剩余3条评论

219

看一下反射器:

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的评论)中所说。


28
感谢您把之前回答中的猜测都去掉了。 - bopapa_1979
2
简而言之,如果为nullConvert.ToInt32会返回0,以避免int.Parse引发ArgumentNullException - André Leria
5
表达式 default(int) 在编译时求值,因为它是一个内在的值 - 表达式的结果是 0,所以编译器插入了字面量 0。IL 反汇编工具并不知道更好的方法,所以它们只会显示一个字面的零。 - antiduh
1
它无法更改 - 该表达式的结果在.NET二进制文件中硬编码,并且可能有无数个地方的代码正在检查从default(int)派生的值(例如,检查类成员变量是否已从0更改)。为了影响对default(int)值的更改,全球所有的.Net代码都必须重新编译,否则没有人的程序将能够正常工作。 - antiduh
4
完全没有关系。用户复制了反映的代码。更改它将是对编译结果的不正确呈现。如果用户拥有原始源代码,并且原始源代码包含"default(int)",那么这就是用户会发布的内容。 - rshadman
显示剩余5条评论

97

没有实质性的区别。
Convert.ToInt32() 内部调用 int.Parse()

唯一不同之处是当参数是 null 时,Convert.ToInt32() 返回 0

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


8
更精确地说,Convert.ToInt32(string) 在内部调用 int.Parse。然而,Convert.ToInt32(object) 调用了 ((IConvertible)value).ToInt32,在字符串的情况下会调用 Convert.ToInt32(string)...有点复杂... - Timwi
3
Convert.ToInt32(char)会返回(int)value,将'1'转换成49。一般来说这不是期望的功能。 - Dale K

49

int.Parse(string s)

  • 整数在范围内 > 返回整数值
  • 空值 > 抛出ArguementNullException异常
  • 格式不正确 > 抛出FormatException异常
  • 值超出范围 > 抛出OverflowException异常

Convert.ToInt32(string s)

  • 整数在范围内 > 返回整数值
  • 空值 > 返回"0"
  • 格式不正确 > 抛出FormatException异常
  • 值超出范围 > 抛出OverflowException异常

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

  • 整数在范围内 > 返回整数值,isParsed为true
  • 空值 > 返回"0",isParsed为false
  • 格式不正确 > 返回"0",isParsed为false
  • 值超出范围 > 返回"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);
        }
    }

1
请将以下与编程有关的内容从英语翻译成中文。只返回翻译后的文本:参考:https://www.codeproject.com/Articles/32885/Difference-Between-Int-Parse-Convert-ToInt-and - Daniel B
非常有用的总结,谢谢! - Lorenzo Bassetti

25

区别在于:

Int32.Parse()Int32.TryParse() 只能转换字符串。而 Convert.ToInt32() 可以接受任何实现 IConvertible 接口的类。如果传递给它一个字符串,则它们是等效的,除了会增加类型比较等额外开销。如果要转换字符串,则 TryParse() 可能是更好的选择。


13

Int32.parse(string)--->

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) --> 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 

1
添加参考链接:https://www.codeproject.com/Articles/32885/Difference-Between-Int-Parse-Convert-ToInt-and - T.Todua

11
TryParse比Parse更快...

这些函数中的第一个,Parse,在任何.Net开发人员中应该都很熟悉。此函数将接收一个字符串,并尝试从中提取整数,然后返回整数。如果遇到无法解析的内容,则会引发FormatException异常,或者如果数字太大则引发OverflowException异常。此外,如果传递给它一个null值,它也可能引发ArgumentException异常。

TryParse是新版本.Net 2.0框架中新增的功能,解决了原始Parse函数存在的一些问题。主要区别在于异常处理非常缓慢,因此如果TryParse无法解析字符串,则不像Parse那样抛出异常。相反,它返回一个布尔值,指示是否成功解析数字。因此,您必须将要解析的字符串和一个Int32 out参数一起传递给TryParse以填充。我们将使用分析器来检查TryParse和Parse之间在字符串可以正确解析和无法正确解析的情况下的速度差异。

Convert类包含一系列将一个基础类转换为另一个类的函数。我认为Convert.ToInt32(string)只检查空字符串(如果字符串为空,则返回零,不像Parse),然后调用Int32.Parse(string)。我将使用分析器来确认这一点,并查看使用Convert而不是Parse是否对性能产生任何实际影响。

带有示例的来源

希望这可以帮助您。


3
当您查看TryParse源代码时,实际上它根本没有异常处理,只有字符操作和位移操作。感谢提供链接。 - Chris S
3
根据这些基准测试(http://cc.davelozinski.com/c-sharp/fastest-way-to-convert-a-string-to-an-int),除非你要转换超过2百万个对象,否则Parse,TryParse和Convert的速度基本相同。 - Free Coder 24

5
Convert.ToInt32

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

它会尝试从以下类型进行转换:

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 )

4
这里有关于 int.ParseConvert.ToInt32 的详细说明: 比如说,你有一个字符数组,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 在输出方面没有任何区别。两者都返回正确的整数。

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接