out关键字如何实现指针回传?为何out *l写法可正常运行?
C#引用与指针写法等效的原因疑问及解析
问题背景
第一段使用引用的代码逻辑清晰易懂:
ref var l = ref Output22[0][i]; ref var r = ref Output22[1][i]; SpuReverb.Process(ref Reverb, l, r, out l, out r);
但使用指针取址的写法也能正常运行,且效果完全一致:
var l = &output22[0][i]; // float* var r = &output22[1][i]; SpuReverb.Process(ref Reverb, *l, *r, out *l, out *r);
按常理*l是指针指向的值,并非引用,为何两种写法效果相同?
原因解析
这是因为C#编译器在处理ref/out参数的上下文时,会自动将*l这类解引用表达式转换为对应内存位置的引用,底层逻辑和直接使用引用变量完全一致:
- 对于方法的输入参数,如果接受的是值类型的引用(比如
ref float),传递*l时,编译器不会传递值的副本,而是直接把*l指向的内存地址包装为引用传递给方法。 - 对于
out *l这种写法,编译器会识别出这是要操作指针指向的内存位置,直接将该位置转换为ref float类型的引用绑定到out参数上,方法对out参数的修改会直接作用到原数组的内存位置。
简单说,虽然表面写的是取值操作*l,但在ref/out参数的场景下,编译器会把它解析为指向对应内存地址的引用,所以最终效果和直接使用ref变量完全一致。
内容的提问来源于stack exchange,提问作者aybe
相关产品推荐
相关产品推荐

