【问题标题】:Differences between int.Parse() and ConvertTo.Int32()? [duplicate]int.Parse() 和 Convert To.Int32() 的区别? [复制]
【发布时间】: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 类的方法有什么不同吗?

【问题讨论】:

标签: c# parsing


【解决方案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 并相应地处理失败。

              【讨论】:

                猜你喜欢
                • 2011-07-10
                • 1970-01-01
                • 2010-09-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-12-29
                相关资源
                最近更新 更多