从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");
代码会跟随链接的引用,直到它到达对象吗?
答案 0 :(得分:0)
看看这个article。
参考c#中的c#isn&t 39指针。这是不同的概念。
当在方法的参数列表中使用时,ref关键字表示 参数是通过引用传递的,而不是通过值传递的。的效果 通过引用传递是对被调用的参数的任何更改 方法反映在调用方法中。例如,如果是来电者 传递局部变量表达式或数组元素访问 表达式,被调用的方法替换ref所针对的对象 参数引用,然后是调用者的局部变量或数组 element现在引用方法返回时的新对象。