繁体   English   中英

int.Parse是否在C#中使用装箱/拆箱或类型转换?

[英]Does int.Parse uses boxing/unboxing or type casting in C#?

当我说的时候会发生什么

 int a = int.Parse("100");

在Prse方法中是否有任何拳击/ unboxung或类型转换?

没有拳击或拆箱。 你问来干什么? 解析算法比box / unbox操作昂贵得多,所以即使有一个,你也不会“感觉”到性能差异。

我不相信那里有任何拆箱。 我假设代码使用一个int变量并返回它,因此没有装箱/拆箱。

编辑 :我同意280Z28 我只是看了一下代码,它非常复杂。 最终的值没有像我想象的那样装箱,但是有一些冗长的预处理步骤才能到达那里,所以即使装箱也不会有很大的性能变化。

顺便说一句,如果您不知道,可以使用Reflector自己查看代码。

是。 使用Reflector ,您可以准确地看到发生了什么。 我看不到任何拳击,但有一些演员阵容,例如:

private static unsafe void StringToNumber(string str, NumberStyles options, ref NumberBuffer number, NumberFormatInfo info, bool parseDecimal)
{
    if (str == null)
    {
        throw new ArgumentNullException("String");
    }
    fixed (char* str2 = ((char*) str))
    {
        char* chPtr = str2;
        char* chPtr2 = chPtr;
        if (!ParseNumber(ref chPtr2, options, ref number, info, parseDecimal) ||
           ((((long) ((chPtr2 - chPtr) / 2)) < str.Length) && //cast
            !TrailingZeros(str, (int) ((long) ((chPtr2 - chPtr) / 2))))) //cast
        {
            throw new FormatException(Environment.GetResourceString("Format_InvalidString"));
        }
    }
}

或者,这发生在循环中:

private static unsafe char* MatchChars(char* p, string str)
{
    fixed (char* str2 = ((char*) str)) //cast
    {
        char* chPtr = str2;
        return MatchChars(p, chPtr);
    }
}

真正的问题是 - 所以?

添加我的位。

“取消装箱”的术语/技术仅与盒装值类型相关。 因此,如果值类型变量未加框(转换为引用类型),则可以将其取消装箱。

在您的情况下,您具有有效的引用类型值,该值无法取消装箱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM