c#中ref和out参数之间哪个更亮

时间:2012-11-21 21:21:35

标签: c# wpf

任何人都可以告诉我refout之间哪一个更亮。我知道refout关键字和用法之间的确切差异。

在我的情况下,我可以使用refout,但想知道较轻的一个。

如果有人需要参考,请转到here并让我知道较轻的那些。

提前致谢..

4 个答案:

答案 0 :(得分:12)

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

... 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

... ref ...

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

... outref实际上是相同的。唯一真正的区别是out告诉编译器期望在返回方法之前设置值。您可以将值发送到具有out标志的函数,但编译器会将其视为未分配的变量。运行时并不在乎。两者都将被创建为指向变量的指针。您最好使用描述功能所需功能的关键字。 “可能”在下面的JITer中进行的任何优化都会对应用程序产生接近0的影响。

答案 1 :(得分:3)

他们很可能在低级别相同。如果存在性能差异,则可能忽略不计,并且有更好的优化场所。

答案 2 :(得分: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

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

答案 3 :(得分:2)

请参阅this link特别是“结论4:”部分:

  

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

相同

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