我正在通过C#阅读Jeffrey Richters CLR,并在其中用ref参数说,引用本身是按值传递的.这对我来说很有意义,似乎与指针类似.
即在C中,如果我将指针传递给函数,然后通过malloc分配指针,它将指针更改为指向新的内存位置,但是我知道,因为指针本身是一个副本,它不会重新分配原来的指针.传递给函数.为了完成对函数外部指针的更改,我必须使用双指针.
但是,在C#中:
void Swap(ref Object a, ref Object b)
{
Object t = b;
b = a;
a =t ;
}
Run Code Online (Sandbox Code Playgroud)
作品.这向我表明参考不是按价值.与上面的malloc类似,我假设我可以通过引用传递一个对象并为其分配一个新对象,并且重新分配将在函数外部保留.
有人可以澄清我的困惑吗?
你有点偏.随着引用类型的引用是按值传递.传递ref参数是不同的.在
private void Frob(Foo foo) // Foo is a class
{
}
Run Code Online (Sandbox Code Playgroud)
Foo在调用站点处对类型对象的引用的副本被传递到该方法中Frob.此引用的副本按值传递.此引用和调用站点上的引用指向内存中的同一对象,并将继续这样做,直到其中一个指向内存中的某个其他对象.例如,如果在这个方法里面,我们写
foo = someOtherFoo;
Run Code Online (Sandbox Code Playgroud)
然后,该参数不再引用与呼叫站点上的对象相同的对象.呼叫站点参考未更改.
现在考虑我们是否引入了ref关键字.
private void Frob(ref Foo foo)
{
foo = someOtherFoo;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,foo是调用站点上变量的别名.这些变量不只是指向内存中的同一个对象,就好像它们是同一个变量!作为结果,指出foo要someOtherFoo不仅要改变foo这个方法里面,这种变化也将在呼叫部位反射.
| 归档时间: |
|
| 查看次数: |
622 次 |
| 最近记录: |