【问题标题】:Why is ref needed in this case?为什么在这种情况下需要 ref ?
【发布时间】:2016-08-08 22:45:25
【问题描述】:

我在查看参考源,发现 NumberToInt32:

http://referencesource.microsoft.com/#mscorlib/system/number.cs,a2e15b1a0fe0c25c

[System.Security.SecuritySafeCritical]  // auto-generated
internal unsafe static Int32 ParseInt32(String s, NumberStyles style, NumberFormatInfo info) {

    Byte * numberBufferBytes = stackalloc Byte[NumberBuffer.NumberBufferBytes];
    NumberBuffer number = new NumberBuffer(numberBufferBytes);
    Int32 i = 0;

    StringToNumber(s, style, ref number, info, false);

    if ((style & NumberStyles.AllowHexSpecifier) != 0) {
        if (!HexNumberToInt32(ref number, ref i)) { 
            throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
        }
    }
    else {
        if (!NumberToInt32(ref number, ref i)) {
            throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
        }
    }
    return i;           
}

[System.Security.SecuritySafeCritical]  // auto-generated
private unsafe static Boolean NumberToInt32(ref NumberBuffer number, ref Int32 value) {

    Int32 i = number.scale;
    if (i > Int32Precision || i < number.precision) {
        return false;
    }
    char * p = number.digits;
    Contract.Assert(p != null, "");
    Int32 n = 0;
    while (--i >= 0) {
        if ((UInt32)n > (0x7FFFFFFF / 10)) {
            return false;
        }
        n *= 10;
        if (*p != '\0') {
            n += (Int32)(*p++ - '0');
        }
    }
    if (number.sign) {
        n = -n;
        if (n > 0) {
            return false;
        }
    }
    else {
        if (n < 0) {
            return false;
        }
    }
    value = n;
    return true;
}

NumberToInt32 使用ref 关键字进行编号的原因是什么? 函数中的数字似乎没有变化。

【问题讨论】:

  • 考虑到它在不安全的上下文和非常低级的函数中运行,他们试图节省内存或性能的原因。这些缓冲区在堆栈上,他们不想复制它们。
  • NumberBuffer 声明是必不可少的。类和结构对象被处理differently。另请参阅this SO 问题。

标签: c# .net


【解决方案1】:

如果您查看NumberBuffer 源代码,您会注意到该结构有五个字段,因此非常大,可以复制。所以在这里使用ref 的想法只是速度优化。您无需修改​​任何ref 参数,因为您可以。

【讨论】:

    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多