gpt4 book ai didi

C# - Ref 类型比较导致指针混淆?

转载 作者:太空狗 更新时间:2023-10-29 15:51:19 24 4
gpt4 key购买 nike

我正在通过 C# 阅读 Jeffrey Richters CLR,他在其中说使用 ref 参数引用本身是按值传递的。这对我来说很有意义,并且看起来类似于指针。

即在 C 中,如果我将一个指针传递给一个函数,然后通过 malloc 分配指针,它会将指针更改为指向新的内存位置,但是我知道,因为指针本身是一个副本,所以它不会重新分配传递的原始指针进入功能。为了完成对函数外部指针的更改,我必须使用双指针。

但是,在 C# 中:

void Swap(ref Object a, ref Object b)
{
Object t = b;
b = a;
a =t ;
}

有效。这向我表明引用不是按值计算的。与上面的 malloc 类比,我假设我可以通过引用传递一个对象并为其分配一个新对象,并且重新分配将在函数之外持续存在。

谁能解开我的困惑?

最佳答案

你有点不对劲。对于引用类型引用按值传递。传递 ref 参数 是不同的。在

private void Frob(Foo foo) // Foo is a class
{

}

在调用站点对类型 Foo 的对象的引用副本被传递到方法 Frob 中。此引用副本按值传递。此引用和调用站点上的引用指向内存中的同一个对象,并将继续这样做,直到其中一个指向内存中的其他对象。例如,如果在这个方法中,我们写

foo = someOtherFoo;

然后参数不再引用与调用站点处的对象相同的对象。调用站点引用未更改

现在考虑是否引入 ref 关键字。

private void Frob(ref Foo foo)
{
foo = someOtherFoo;
}

在这种情况下,foo 是调用站点上变量的别名。这些变量不仅仅是指向内存中的同一个对象,就好像它们是同一个变量一样!因此,将 foo 指向 someOtherFoo 不仅会更改此方法内部的 foo,此更改还将反射(reflect)在调用站点.

关于C# - Ref 类型比较导致指针混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5827425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com