【问题标题】:Converting string to int (or something else), is there a prefered way?将字符串转换为 int (或其他),有首选方法吗?
【发布时间】:2012-05-04 06:18:05
【问题描述】:

有时我想知道,在将字符串转换为其他类型(例如 int32)时,是一种方式比另一种方式更好,还是只是口味问题?

Convert.ToInt32("123")

Int32.Parse("123")

其他方式?

如果它不是这个问题中的有效 int,则不考虑这种情况。

【问题讨论】:

  • 如果您不确定字符串,请使用TryParse,这将帮助您了解字符串是否可以转换为int
  • 取决于你是否想知道值是否可以转换。另请参阅 Parse / TryParse stackoverflow.com/questions/467613/parse-v-tryparse
  • TryParse 总是最好的。不要使用 Pare。解析抛出异常。
  • 感谢您的有趣讨论!

标签: c# type-conversion


【解决方案1】:

Convert.ToInt32其实是这样实现的……

int.Parse(value, CultureInfo.CurrentCulture);

...这与您所说的替代方案相同,只是它考虑了文化设置。 int.Parse 方法本身是通过以下方式实现的...

Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.GetInstance(provider));

...其中 Number 是一个不能直接调用的内部类。 Number.ParseInt32 方法标有以下属性...

[MethodImpl(MethodImplOptions.InternalCall)]

...表明它是在 CLR 本身内部实现的。

【讨论】:

    【解决方案2】:

    Conver.ToInt32Int32.Parse 之间的主要区别在于如何处理 null 字符串。 Convert.ToInt32 在这种情况下返回默认值:

    public static int ToInt32(string value)
    {
        if (value == null)    
            return 0;
    
        return Int32.Parse(value, CultureInfo.CurrentCulture);
    }
    

    我不喜欢那样。我认为只有"0" 应该被解析为0。这种行为最初是designed for Visual Basic programmers

    这是一组适用于从 Visual Basic 6 迁移到 Visual Basic .NET 的程序员的转换方法,它反映了 现有的 Visual Basic 6 转换方法。假设是 C# 程序员会更习惯于转换操作符,而 Visual Basic 传统上使用类型的转换方法 转换。

    所以,作为非 VB 程序员,我会选择 Int32.ParseInt32.TryParse

    【讨论】:

      【解决方案3】:

      从字符串转换为 int 时,我总是使用 int.TryParse。因为您并不总是确定可以将字符串转换为 int。像这样:

      string temp="222";
      int intValue;
      if(int.TryParse(temp,out intValue))
      {
          //Something
      }
      

      【讨论】:

        【解决方案4】:

        正如 V4Vendetta 建议的那样,最好使用 TryParse 来避免与转换相关的异常。

        int result = 0;
        
        a = "3";
        string b = "b";
        string c = "2147483648"; //int32 max value + 1
        
        int.TryParse(a, out result); // returns true result=3
        int.TryParse(b, out result); // returns false result=0
        int.TryParse(c, out result); // returns false result=0
        

        【讨论】:

        • 是的,当然,我说的是已经验证过的字符串,或者如果无效则应该给出异常的字符串。
        • 您是否正在验证最小值和最大值?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 2013-07-24
        • 2015-11-15
        • 2013-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多