int.Parse() 和 Convert To.Int32() 的区别? [复制]

Posted

技术标签:

【中文标题】int.Parse() 和 Convert To.Int32() 的区别? [复制]【英文标题】:Differences between int.Parse() and ConvertTo.Int32()? [duplicate] 【发布时间】:2011-07-26 08:25:12 【问题描述】:

可能的重复:difference between Convert.ToInt32 and (int)Whats the main difference between int.Parse() and Convert.ToInt32

C#

type.Parse() 方法和 ConvertTo 类的方法有什么不同吗?

【问题讨论】:

difference between Convert.ToInt32 and (int)、.Net Parse verses Convert 和 Whats the main difference between int.Parse() and Convert.ToInt32 的可能重复项 我会使用 type.TryParse 因为它更安全 更精确的副本是'Whats the main difference between int.Parse() and Convert.ToInt32'。 【参考方案1】:

不,Int32.ParseConvert.ToInt32(string) 之间没有实质性区别。后者只是将它的呼叫转发给Int32.Parse

一个小区别是,如果您将null 传递给Convert.ToInt32,它将返回0,而Int32.Parse 将通过ArgumentNullException 传递

【讨论】:

【参考方案2】:

一个显着的区别是 TypeConverter.ConvertTo(object) 在 object 为 null 时不会抛出异常,但 type.parse 在其内容为 null 时会抛出异常

【讨论】:

【参考方案3】:

最重要的区别是:

-Convert.ToInt32(s) 在 s 为 null 时不抛出异常,但 Parse() 会

如果您从 用户,你通常是用户 Int32.TryParse()

Int32.Parse() 和 Int32.TryParse() 只能转换字符串。 Convert.ToInt32() 可以采用任何类 实现了 IConvertible。

基本上说实话,当你看 在来自 TryParse 的源代码中 实际上没有异常处理 all - 只是字符操作和 位移

有关性能详细信息,请阅读此内容 邮政: http://blogs.msdn.com/b/ianhu/archive/2005/12/19/505702.aspx

【讨论】:

【参考方案4】:

有一些差异,例如Convert 可以从许多对象(Int16、字符串、SByte 等)转换为 Int32。此外,Int32.Parse 可以接受 NumberStyles,而 Convert.ToInt32 不能。

除此之外,Reflector (http://reflector.red-gate.com) 有这样的说法:

类转换:

public static int ToInt32(string value)

    if (value == null)
    
        return 0;
    
    return int.Parse(value, CultureInfo.CurrentCulture);

【讨论】:

【参考方案5】:

AFAIK,int.Parse() 是从定义它的 Number 类继承的。 Convert.ToIn32() 实现了 IConvertable 接口,并在处理转换之前获取您传递的对象的类型。

无论如何,我认为它最终会在 Int32.Parse 结束。

【讨论】:

【参考方案6】:

这是使用 Reflector 检索到的代码。

Int32.Parse:

public static int Parse(string s)

    return 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:

public static int ToInt32(string value)

    if (value == null)
    
        return 0;
    
    return int.Parse(value, CultureInfo.CurrentCulture);

所以,Convert 无论如何都会调用Int32 的方法。使用Int32.Parse 会更有效,但您需要考虑到它可能会在传递null 参数时引发异常。

【讨论】:

【参考方案7】:

转换或直接转换可能会导致数据丢失。您应该考虑使用“is”和“as”而不是强制转换或转换。除了防止数据丢失之外,它们在运行时都更加高效。

正如 Austin 所说,如果您要解析,请使用 tryparse 并相应地处理失败。

【讨论】:

以上是关于int.Parse() 和 Convert To.Int32() 的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Convert.ToInt32()和int.Parse()的区别

Convert.ToInt16 或 32 或 64 和 Int.Parse 有啥区别? [复制]

int.Parse()int.TryParse()和Convert.ToInt32()的区别

Convert.ToInt32(int)和int.Parse三者的区别

C#中(int)int.Parse()int.TryParse()和Convert.ToInt32()的区别

更好地使用 int.Parse 或 Convert.ToInt32 [重复]