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

jbc*_*dge 467 c#

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

Dav*_*kle 431

  • 如果你有一个字符串,并且你希望它总是一个整数(比如说,如果某个Web服务正在以字符串格式递给你一个整数),你就可以使用它Int32.Parse().

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

  • Convert.ToInt32()以对象为参数.(参见Chris S的答案,了解它的工作原理)

    Convert.ToInt32()ArgumentNullException当它的参数为null时也不会抛出Int32.Parse().这也意味着它Convert.ToInt32()可能比我们慢一点Int32.Parse(),虽然在实践中,除非你在一个循环中进行大量的迭代,否则你永远不会注意到它.

  • 正如其他人所指出的,当s为null时,Convert.ToInt32(s)不会抛出异常,但是Parse()会抛出异常."有点慢"完全没有意义,因为你永远不会衡量差异. (51认同)
  • @StealthRabbi:在文档的"返回值"部分:*"32位有符号整数,等于值中的数字,如果值为null,则为0(零)."* (6认同)
  • 实际上,由于`ToInt32`方法对于类型的加载有一个重载,其中有`System.String`,没有时间会丢失辨别类型.实际的代码除了为空值返回0,而对于其他所有内容都返回`int.Parse(value,CultureInfo.CurrentCulture)`. (5认同)
  • 谢谢,罗伯特!我正在编辑我的答案以获得更完整.但就性能而言,我敢打赌,如果你在嵌套循环中调用它,速度的差异是可以检测到的...... (4认同)
  • 请删除你在`Convert.ToInt32()`中提到`Int32.TryParse()`,因为它不正确.如果字符串格式不正确,转换会抛出异常. (3认同)

Chr*_*s S 184

看一下反射器:

int.Parse( "32"):

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

这是一个电话:

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;
}
Run Code Online (Sandbox Code Playgroud)

Convert.ToInt32( "32"):

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

正如第一个(Dave M's)的评论所说.

  • 感谢您从先前的答案中删除所有猜想. (17认同)
  • @SkorunkaFrantišek - 表达式`default(int)`在编译时被计算,因为它是一个内在值 - 表达式的结果是'0`,所以编译器插入一个文字`0`.IL反汇编工具无法更好地了解,因此它们只显示零字. (4认同)
  • @SkorunkaFrantišek这完全不是重点.用户正在复制反射代码.改变它将是对编译内容的错误表示.如果用户具有原始源并且原始源具有默认(int),那么这就是用户将发布的内容. (3认同)
  • 简而言之,如果Convert.ToInt32为null,则返回0,以防止int.Parse引发ArgumentNullException。 (2认同)

sha*_*esh 76

没有差别.内部
Convert.ToInt32()呼叫int.Parse()

除了一件事Convert.ToInt32()返回0时的说法是null

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

  • 更确切地说,`Convert.ToInt32(string)`在内部调用`int.Parse`.但是,`Convert.ToInt32(object)`调用`((IConvertible)值).ToInt32`,在`string`的情况下调用`Convert.ToInt32(string)`...有点复杂...... (5认同)
  • 是的,Convert.ToInt32(char)实际上将返回(int)值,它将'1'变为49.通常不是预期的功能. (3认同)

小智 30

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)


Mat*_*ley 21

区别在于:

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


Bol*_*ait 8

TryParse更快......

第一个这样的函数Parse是任何.Net开发人员都应该熟悉的函数.此函数将接受一个字符串并尝试从中提取整数,然后返回整数.如果它遇到无法解析的内容,则会抛出FormatException,或者如果数字太大而导致OverflowException.此外,如果您传递一个空值,它可以抛出ArgumentException.

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

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

来源举例

希望这可以帮助.

  • 当你从TryParse查看源代码时,它实际上根本没有异常处理 - 只需要字符操作和位移,感谢链接 (3认同)
  • [根据这些基准测试](http://cc.davelozinski.com/c-sharp/fastest-way-to-convert-a-string-to-an-int),Parse,TryParse和Convert几乎就是相同的速度,除非你转换超过200万个对象. (2认同)

小智 7

Int32.parse(字符串)--->

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
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)


小智 5

Convert.ToInt32
Run Code Online (Sandbox Code Playgroud)

有 19 种重载或 19 种不同的调用方式。也许在 2010 版本中更多。

它将尝试从以下类型转换;

对象、布尔值、字符、SByte、字节、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、Decimal、String、Date

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

另一方面,解析只有 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 )
Run Code Online (Sandbox Code Playgroud)