从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参数引用的对象,则调用者的局部变量或数组元素现在引用方法时的新对象回报。