有誰能告訴我哪一個在ref
和out
之間較輕。我知道ref
和out
關鍵字和用法之間的確切區別。c中的ref和out參數之間的關係較輕
在我的情況下,我可以使用ref
和out
,但想知道更輕的。
如果有人需要參考請去here並讓我知道更輕的。
在此先感謝..
有誰能告訴我哪一個在ref
和out
之間較輕。我知道ref
和out
關鍵字和用法之間的確切區別。c中的ref和out參數之間的關係較輕
在我的情況下,我可以使用ref
和out
,但想知道更輕的。
如果有人需要參考請去here並讓我知道更輕的。
在此先感謝..
唯一的區別是編譯器提示。
...了...
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中都會發生的優化對應用程序幾乎沒有影響。
他們很可能會在低級別相同。如果性能存在差異,則可能忽略不計,並且有更好的地方可以優化。
我知道有很多地方可以進行優化,但是想知道與體重比較的確切區別。我有一些可觀察的集合,並通過使用上述關鍵字之一通過推薦傳遞,因此希望優化它們。可以這是開始優化:)謝謝你的答覆。 :) – DotNet
這是一個微型優化。
實際上,如果您看看兩個選項正在生成的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
我只是認爲,在語義上是最正確的一個手頭的情況的選項。
公平地說,有一個非常微小的差異。 'out'爲函數參數添加一個編譯器提示屬性。 –
的確,但我認爲這不會影響性能。 :) –
運行時不關心提示如何同意。 :) –
見this link特別是部分「結論4:」:
「out」和「裁判」實際上正是幕後相同。 CLR只支持「ref」; 「out」就是「ref」,編譯器在已知明確指定變量的時間時強制執行稍微不同的規則。這就是爲什麼在方法超載方面超出/ refne ness是不合法的; CLR無法分辨他們!因此out的類型安全規則必須和ref相同。
out
中的ref
方面實現的,唯一的區別是在什麼編譯和運行時性能會相同。
http://stackoverflow.com/questions/2024450/when-is-the-value-of-ac-sharp-out-or-ref-parameter-actually-returned-to-the –
這裏「ligher」的意思是無論什麼時候通過引用傳遞都會減少內存。 – DotNet
@AndreiSchneider:不是同一個問題。 – IAbstract