我想知道 ref 和 out 关键字在幕后是如何工作的?例如,如果我们在方法上使用它,它会把这个值类型变量放入某个类中以便像使用引用类型一样使用它吗?
in order to work with it as with reference type?
首先,您需要了解“通过引用”(ref
/out
和现在的in
)是不一样的thing 作为“引用类型”。
最终,当您看到:
void SomeMethod(ref int x);
这里 x
是一个引用,也就是指向一个值的“托管指针”;来电者提供引用。所以,当你有:
int a = 123;
SomeMethod(ref a);
这通过获取变量 a
的地址(通常通过 ldloca
或 ldflda
IL 指令)并传递那个 地址作为参数值。
如果 SomeMethod
的主体是:
void SomeMethod(ref int x) {
Write(x);
x = 12;
}
然后 Write(x)
取消引用 指针 x
- 它加载 x
的值,看起来在它指向的地方,从那里得到一个实际值。同样,x=12
取值 12
,查看指针 x
并将 12
写入 无论指针指向何处。
用 C# 指针(又名“非托管指针”)在 unsafe
C# 中编写等价物以显示差异:
void SomeMethod(int* x) {
Write(*x);
*x = 12;
}
int a = 123;
SomeMethod(&a);
out
只是一个奇特的 ref
版本,具有某些“明确赋值”约定; in
同样是 ref
的奇特版本,它允许 readonly
类型可靠高效地工作,同时避免堆栈复制。
我是一名优秀的程序员,十分优秀!