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

c#编译器是否在编译期间解析引用的引用?,c#,pointers,reference,C#,Pointers,Reference,根据我记忆中的C编程语言,若任何指针被分配给另一个指针,我们将使用**前缀来访问原始值 当我将对象实例作为ref Myobject Myobject参数传递给方法时,这是如何工作的。c#是否解析对象的堆地址并在下面的代码中调用printSomething void testFunction(ref MyObject myObject){ myObject.printSomething(); } 所以,如果这是一个递归函数,编译器会跟随引用地址直到找到对象吗 我在下面添加了一个测试场景

根据我记忆中的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”)代码跟随链接的引用直到它到达对象?

看看这个

中的p>REF不是C++中的指针。这是不同的概念

在方法的参数列表中使用时,ref关键字表示 参数是通过引用传递的,而不是通过值传递的。影响 通过引用传递是指调用 方法反映在调用方法中。例如,如果调用方 传递局部变量表达式或数组元素访问权限 表达式,而被调用的方法将替换引用所指向的对象 参数引用,然后调用方的局部变量或数组 元素现在在方法返回时引用新对象


指针是对象的起始地址。对象的结构必须在c#和c语言中定义相同。因为c#是托管的,所以必须使用封送处理技术将对象移动到非托管内存中。使用两个星号可以表示指针是指向某个地址的地址或指向某个数组的地址。编译不做任何事情,您必须执行所有正确的定义。编译只是将对象的起始地址放在堆栈上。由于在示例中没有在任何地方重新分配
myObject
,因此
ref
-关键字是完全无用的。当然,
printSomething
会为提供的实例调用。我看不到其他的。我不明白你在问什么。我添加了一个测试场景来澄清一些问题。我希望我说得更清楚。@jdweng这里没有调用的意义,它是纯托管的c#code,而不是“c编程语言”的非托管。读第一行。