C# 为什么在这种情况下需要ref?

C# 为什么在这种情况下需要ref?,c#,.net,C#,.net,我正在查看参考源,发现NumberToInt32: [System.Security.SecuritySafeCritical]//自动生成 内部不安全静态Int32 ParseInt32(字符串s、NumberStyles样式、NumberFormatInfo信息){ Byte*numberBufferBytes=stackalloc字节[NumberBuffer.numberBufferBytes]; NumberBuffer number=新的NumberBuffer(numberBuf

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

[System.Security.SecuritySafeCritical]//自动生成
内部不安全静态Int32 ParseInt32(字符串s、NumberStyles样式、NumberFormatInfo信息){
Byte*numberBufferBytes=stackalloc字节[NumberBuffer.numberBufferBytes];
NumberBuffer number=新的NumberBuffer(numberBufferBytes);
int32i=0;
字符串编号(s、样式、参考号、信息、假);
如果((样式和数字样式.AllowHexSpecifier)!=0){
如果(!HexNumberToInt32(参考号,参考i)){
抛出新的OverflowException(Environment.GetResourceString(“Overflow_Int32”);
}
}
否则{
如果(!NumberToInt32(参考编号,参考i)){
抛出新的OverflowException(Environment.GetResourceString(“Overflow_Int32”);
}
}
返回i;
}
[System.Security.SecuritySafeCritical]//自动生成
私有不安全静态布尔数Int32(ref NumberBuffer number,ref Int32值){
Int32 i=数字。刻度;
if(i>Int32Precision | | i=0){
如果((UInt32)n>(0x7FFFFFFF/10)){
返回false;
}
n*=10;
如果(*p!='\0'){
n+=(Int32)(*p++-'0');
}
}
if(数字符号){
n=-n;
如果(n>0){
返回false;
}
}
否则{
if(n<0){
返回false;
}
}
值=n;
返回true;
}
NumberToInt32
使用
ref
关键字进行编号的原因是什么?
函数中的数字似乎没有变化。

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

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

考虑到它运行在不安全的上下文和非常低级的函数中,它们试图节省内存或性能。这些缓冲区在堆栈上,它们不想复制它们。NumberBuffer声明是必不可少的。处理类和结构对象。另请参阅问题。考虑到它运行在不安全的上下文和非常低级的函数中,它们试图节省内存或性能。这些缓冲区在堆栈上,它们不想复制它们。NumberBuffer声明是必不可少的。处理类和结构对象。也见如此问题。
[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;
}