任何人都可以告诉我ref
和out
之间哪一个更亮。我知道ref
和out
关键字和用法之间的确切差异。
在我的情况下,我可以使用ref
和out
,但想知道较轻的一个。
如果有人需要参考,请转到here并让我知道较轻的那些。
提前致谢..
答案 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
... out
和ref
实际上是相同的。唯一真正的区别是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
实现的,唯一的区别在于编译,运行时性能相同。