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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#编译器在编译期间是否解析了引用的引用?相关的知识,希望对你有一定的参考价值。

从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");代码是否会跟踪链接引用,直到它到达对象?

答案

看看这个article

参考c#不是c ++中的指针。这是不同的概念。

在方法的参数列表中使用时,ref关键字表示参数是通过引用传递的,而不是通过值传递的。通过引用传递的效果是对被调用方法中的参数的任何更改都会反映在调用方法中。例如,如果调用者传递局部变量表达式或数组元素访问表达式,并且被调用的方法替换了ref参数引用的对象,则调用者的局部变量或数组元素现在引用方法时的新对象回报。

以上是关于c#编译器在编译期间是否解析了引用的引用?的主要内容,如果未能解决你的问题,请参考以下文章

warning MSB3245: 未能解析此引用。未能找到程序集“CemeteryBLL”。请检查磁盘上是否存在该程序集。 如果您的代码需要此引用,则可能出现编译错误。

在 .NET 中的编译时检查引用/类型是不是存在

C++17 编译器不应该发现对未定义值的传递引用吗?

Objective-C——强引用弱引用(StrongWeak)

常见C语言知识要点

Vue属性或方法未在实例上定义但在渲染期间引用?