1

谁能告诉我ref和之间哪个更轻out。我也知道关键字和用法ref之间的确切区别。out

就我而言,我可以同时使用refand out,但想知道较轻的那个。

如果有人需要参考,请到这里告诉我较轻的。

提前致谢..

4

4 回答 4

12

唯一的区别是编译器提示。

... 出去 ...

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 中“可能”发生的任何优化对应用程序的影响几乎为零。

于 2012-11-21T21:28:46.863 回答
3

它们很可能在低级别是相同的。如果存在性能差异,它可能可以忽略不计,并且有更好的地方可以优化。

于 2012-11-21T21:24:14.117 回答
3

这是一个微优化。

实际上,如果您查看为这两个选项生成的 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

我只是建议在语义上最适合当前情况的选项。

于 2012-11-21T21:27:16.667 回答
2

请参阅此链接 特别是“结论 4:”部分:

“out”和“ref”实际上在幕后完全一样。CLR 只支持“ref”;“out”只是“ref”,其中编译器执行的规则略有不同,关于何时知道所讨论的变量已被明确分配。这就是为什么只在 out/ref-ness 上不同的方法重载是非法的;CLR 无法区分它们!因此,out 的类型安全规则必须与 ref 相同。

out是根据 实现的ref,唯一的区别在于编译的内容,运行时性能将相同

于 2012-11-21T21:36:04.987 回答