![](/img/trans.png)
[英]When is the value of a C# 'out' or 'ref' parameter actually returned to the caller?
[英]Which is lighter between ref and out parameter in c#
任何人都可以告訴我在ref
和out
之間哪個更輕。 我知道ref
和out
關鍵字以及用法之間的確切區別。
就我而言,我既可以使用ref
,也可以使用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中“可能”進行的任何優化都將對應用程序產生接近0的影響。
在低層,它們很可能是相同的。 如果存在性能差異,則可以忽略不計,並且有更好的優化地方。
這是微優化。
實際上,如果您查看為這兩個選項生成的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”,在該位置上,編譯器將強制執行有關何時已知已明確分配有關變量的稍微不同的規則。 這就是為什么使方法重載完全不同的原因是非法的。 CLR無法分辨它們! 因此,out的類型安全性規則必須與ref的規則相同。
out
是根據ref
實現的,唯一的區別是編譯方式不同,並且運行時性能相同 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.