当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《int.Parse()和Convert.ToInt32之间的主要区别是什么》经验,为你挑选了7个好方法。

看一下反射器:

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



1> Dave Markle..:

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

2> Chris S..:

看一下反射器:

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


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

3> shahkalpesh..:

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

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

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


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

4> 小智..:
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);
        }
    }



5> Matthew Scha..:

区别在于:

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



6> BoltBait..:

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

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

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 

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有