Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# int.TryParse实际上是如何工作的_C# - Fatal编程技术网

C# int.TryParse实际上是如何工作的

C# int.TryParse实际上是如何工作的,c#,C#,我已经寻找了int.TryParse方法实现,它实际上是如何工作的,但我还没有找到。我必须知道,关于字符串,它是否是数值,但我现在不想转换它 因此,我只需要int.TryParse的bool结果。因此,问题是: 是否有任何函数只能提供bool结果 及 我想知道,int.TryParse实际上是如何工作的(是否有try…catch或迭代输入string的字符) 如果只需要bool结果,只需使用返回值并忽略out参数即可 bool successfullyParsed = int.TryParse(

我已经寻找了
int.TryParse
方法实现,它实际上是如何工作的,但我还没有找到。我必须知道,关于
字符串
,它是否是数值,但我现在不想转换它

因此,我只需要
int.TryParse
bool
结果。因此,问题是:

  • 是否有任何函数只能提供
    bool
    结果
  • 我想知道,
    int.TryParse
    实际上是如何工作的(是否有
    try…catch
    或迭代输入
    string
    的字符)

  • 如果只需要
    bool
    结果,只需使用返回值并忽略
    out
    参数即可

    bool successfullyParsed = int.TryParse(str, out ignoreMe);
    if (successfullyParsed){
        // ...
    }
    
    编辑:同时,您还可以查看:


    如果我想知道一些东西是如何实际实现的,我将使用它来反编译.NET代码

    结果是:

    // int
    /// <summary>Converts the string representation of a number to its 32-bit signed integer equivalent. A return value indicates whether the operation succeeded.</summary>
    /// <returns>true if s was converted successfully; otherwise, false.</returns>
    /// <param name="s">A string containing a number to convert. </param>
    /// <param name="result">When this method returns, contains the 32-bit signed integer value equivalent to the number contained in s, if the conversion succeeded, or zero if the conversion failed. The conversion fails if the s parameter is null, is not of the correct format, or represents a number less than <see cref="F:System.Int32.MinValue"></see> or greater than <see cref="F:System.Int32.MaxValue"></see>. This parameter is passed uninitialized. </param>
    /// <filterpriority>1</filterpriority>
    public static bool TryParse(string s, out int result)
    {
        return Number.TryParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
    }
    
    
    // System.Number
    internal unsafe static bool TryParseInt32(string s, NumberStyles style, NumberFormatInfo info, out int result)
    {
        byte* stackBuffer = stackalloc byte[1 * 114 / 1];
        Number.NumberBuffer numberBuffer = new Number.NumberBuffer(stackBuffer);
        result = 0;
        if (!Number.TryStringToNumber(s, style, ref numberBuffer, info, false))
        {
            return false;
        }
        if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None)
        {
            if (!Number.HexNumberToInt32(ref numberBuffer, ref result))
            {
                return false;
            }
        }
        else
        {
            if (!Number.NumberToInt32(ref numberBuffer, ref result))
            {
                return false;
            }
        }
        return true;
    }
    

    仅仅因为
    int.TryParse
    给了你这个值并不意味着你需要保留它;您可以很高兴地这样做:

    int temp;
    if (int.TryParse(inputString, out temp))
    {
        // do stuff
    }
    
    如果不需要,可以完全忽略
    temp
    。如果你真的需要它,那么它会在你想要的时候等着你


    至于内部,据我记忆所及,它试图将字符串的原始字节作为int读取,并测试结果是否有效,或者其他什么;它不像遍历非数字字符那样简单。

    Regex是编译的,因此为了提高速度,只需创建一次并重用它。
    新的比iMatch需要更长的时间。
    这只检查所有数字。
    它不检查范围。
    如果您需要测试范围,那么TryParse是一个不错的选择

    private static Regex regexInt = new Regex("^\\d+$");
    static bool CheckReg(string value)
    {
        return regexInt.IsMatch(value);
    }
    

    检查此简单程序以了解
    int.TryParse

     class Program
     {
        static void Main()
        {
            string str = "7788";
            int num1;
            bool n = int.TryParse(str, out num1);
            Console.WriteLine(num1);
            Console.ReadLine();
        }
    }
    

    输出为:7788

    TryParse是单行解析或验证的最佳方式:

    int nNumber = int.TryParse("InputString", out nNumber) ? nNumber : 1;
    
    简要说明:

  • nNumber将初始化为零
  • int.TryParse()尝试解析“InputString”并验证它,如果成功设置为nNumber
  • short if?:检查int.TryParse()结果,返回nNumber或1作为默认值
  • 现在,我们可以在C#7.0及更高版本中编写以下内容:

    if (int.TryParse(inputString, out _))
    {
        //do stuff
    }
    

    1.不,没有。您可以使用
    Convert.ToInt32()
    ,但如果无法解析字符串,它将引发异常。2.它必须遍历字符串,但可能不会捕获任何异常,因为它比从
    Convert.ToInt32()捕获异常要快。
    您可以使用regex^\d+$。或者为IsDigit计算每个字符。它比我想的更复杂:)谢谢
    在声明局部变量“nCurPage”之前不能使用它
    亲爱的devin burke,你说得对,但它可以工作。我多次使用它,没有任何错误或警告…这不是为了回答问题。out做什么?@mrid它指定调用范围中的一个变量被赋予具有写访问权限的方法范围。例如,如果一个变量
    int-someInt
    被传递给
    int.TryParse
    比如
    int.TryParse(out-someInt)
    int.TryParse
    可以将其输出放在
    someInt
    中,即使它通常不在范围内。@themefield-它在文章正文中正确地回答了这个问题:“所以问题是:1)是否有任何函数只能提供布尔结果”。
    if (int.TryParse(inputString, out _))
    {
        //do stuff
    }