2012-11-21 27 views
1

有誰能告訴我哪一個在refout之間較輕。我知道refout關鍵字和用法之間的確切區別。c中的ref和out參數之間的關係較輕

在我的情況下,我可以使用refout,但想知道更輕的。

如果有人需要參考請去here並讓我知道更輕的。

在此先感謝..

+1

http://stackoverflow.com/questions/2024450/when-is-the-value-of-ac-sharp-out-or-ref-parameter-actually-returned-to-the –

+0

這裏「ligher」的意思是無論什麼時候通過引用傳遞都會減少內存。 – DotNet

+1

@AndreiSchneider:不是同一個問題。 – IAbstract

回答

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 

... outref實際上是相同的。唯一真正的區別是out告訴編譯器期望在返回方法之前設置該值。您可以將值發送給具有out標誌的函數,但編譯器會再次將其視爲未分配的變量。運行時並不關心。兩者都將被創建爲指向變量的指針。您最好使用描述您所期望的功能的關鍵字。任何「可能」在下面的JITer中都會發生的優化對應用程序幾乎沒有影響。

3

他們很可能會在低級別相同。如果性能存在差異,則可能忽略不計,並且有更好的地方可以優化。

+0

我知道有很多地方可以進行優化,但是想知道與體重比較的確切區別。我有一些可觀察的集合,並通過使用上述關鍵字之一通過推薦傳遞,因此希望優化它們。可以這是開始優化:)謝謝你的答覆。 :) – DotNet

3

這是一個微型優化。

實際上,如果您看看兩個選項正在生成的IL代碼,您將看不到任何區別。 除編譯器提示,馬修粉飾表示:

.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 

我只是認爲,在語義上是最正確的一個手頭的情況的選項。

+1

公平地說,有一個非常微小的差異。 'out'爲函數參數添加一個編譯器提示屬性。 –

+0

的確,但我認爲這不會影響性能。 :) –

+0

運行時不關心提示如何同意。 :) –

2

this link特別是部分「結論4:」:

「out」和「裁判」實際上正是幕後相同。 CLR只支持「ref」; 「out」就是「ref」,編譯器在已知明確指定變量的時間時強制執行稍微不同的規則。這就是爲什麼在方法超載方面超出/ refne ness是不合法的; CLR無法分辨他們!因此out的類型安全規則必須和ref相同。

out中的ref方面實現的,唯一的區別是在什麼編譯和運行時性能會相同