c#编译器在编译期间是否解析了引用的引用?

时间:2017-12-22 10:23:16

标签: c# pointers reference

从C编程语言到目前为止,如果将任何指针分配给另一个指针,我们将使用**前缀来访问原始值。

当我将对象实例作为ref Myobject myObject参数传递给方法时,这是如何工作的。 c#是否解析了对象的堆地址并在下面的代码中调用printSomething

void testFunction(ref MyObject myObject){
    myObject.printSomething();
}

因此,如果这是一个递归函数,编译器会跟踪引用地址,直到它找到对象吗?

我在下面添加一个测试场景;

public class Test
{


    public Test()
    {
        StringBuilder str = new StringBuilder();
        Function(ref str);
        Console.WriteLine(str.ToString());
    }

    int referenceCount = 0;

    int Function(ref StringBuilder sBuilder)
    {
        referenceCount++;

        if (referenceCount == 100)
        {
            sBuilder.Append("foo");
            return referenceCount;
        }

        Function(ref sBuilder);
        return referenceCount;
    }

    public static void Main(string[] args)
    {
        new Test();
        Console.ReadLine();
    }

}

如果我按预期删除if块会给出堆栈溢出异常,所以对于每个方法调用,在堆栈中保留一个新的引用。在将它们中的100个相互链接后,我在最后一个上调用一个方法。 sBuilder.Append("foo");代码会跟随链接的引用,直到它到达对象吗?

1 个答案:

答案 0 :(得分:0)

看看这个article

参考c#中的c#isn&t 39指针。这是不同的概念。

  

当在方法的参数列表中使用时,ref关键字表示   参数是通过引用传递的,而不是通过值传递的。的效果   通过引用传递是对被调用的参数的任何更改   方法反映在调用方法中。例如,如果是来电者   传递局部变量表达式或数组元素访问   表达式,被调用的方法替换ref所针对的对象   参数引用,然后是调用者的局部变量或数组   element现在引用方法返回时的新对象。