谁能告诉我ref
和之间哪个更轻out
。我也知道关键字和用法ref
之间的确切区别。out
就我而言,我可以同时使用ref
and out
,但想知道较轻的那个。
如果有人需要参考,请到这里告诉我较轻的。
提前致谢..
唯一的区别是编译器提示。
... 出去 ...
public static void TestOut(out int test)
{
test = 1;
}
.method public hidebysig static void TestOut([out] int32& test) cil managed
{
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.1
IL_0002: stind.i4
IL_0003: ret
} // end of method Program::TestOut
...参考...
public static void TestRef(ref int test)
{
test = 1;
}
.method public hidebysig static void TestRef(int32& test) cil managed
{
// Code size 4 (0x4)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.1
IL_0002: stind.i4
IL_0003: ret
} // end of method Program::TestRef
...out
并且ref
实际上是相同的。唯一真正的区别是 out 告诉编译器期望在方法返回之前设置该值。您可以将值发送给具有out
标志的函数,但编译器再次将其视为未分配的变量。运行时并不真正关心。两者都将被创建为指向变量的指针。您最好使用描述您期望的功能的关键字。在下面的 JITer 中“可能”发生的任何优化对应用程序的影响几乎为零。
它们很可能在低级别是相同的。如果存在性能差异,它可能可以忽略不计,并且有更好的地方可以优化。
这是一个微优化。
实际上,如果您查看为这两个选项生成的 IL 代码,您会发现没有区别。除了 Matthew Whited 指出的编译器提示:
.method private hidebysig static void Out([out] valuetype [mscorlib]System.DateTime& d) cil managed
.method private hidebysig static void Ref(valuetype [mscorlib]System.DateTime& d) cil managed
我只是建议在语义上最适合当前情况的选项。
请参阅此链接 特别是“结论 4:”部分:
“out”和“ref”实际上在幕后完全一样。CLR 只支持“ref”;“out”只是“ref”,其中编译器执行的规则略有不同,关于何时知道所讨论的变量已被明确分配。这就是为什么只在 out/ref-ness 上不同的方法重载是非法的;CLR 无法区分它们!因此,out 的类型安全规则必须与 ref 相同。
out
是根据 实现的ref
,唯一的区别在于编译的内容,运行时性能将相同。