編譯會談更新:(不優化編譯,以優化的編譯的代碼是相同的,感謝您的意見。):
public CustomObject MyMethod()
{
var myObject = new CustomObject();
return myObject
}
var myObject = new CustomObject();
01933516 mov ecx,58413C4h
0193351B call 014D30F4
01933520 mov dword ptr [ebp-44h],eax
01933523 mov ecx,dword ptr [ebp-44h]
01933526 call 01930D10
0193352B mov eax,dword ptr [ebp-44h]
0193352E mov dword ptr [ebp-3Ch],eax
return myObject;
01933531 mov eax,dword ptr [ebp-3Ch]
01933534 mov dword ptr [ebp-40h],eax
01933537 nop
01933538 jmp 0193353A
VS
public CustomObject MyMethod()
{
return new CustomObject();
}
return new CustomObject();
00FD2E11 mov ecx,4E70F48h
00FD2E16 call 00A830F4
00FD2E1B mov dword ptr [ebp-40h],eax
00FD2E1E mov ecx,dword ptr [ebp-40h]
00FD2E21 call 00FD0D10
00FD2E26 mov eax,dword ptr [ebp-40h]
00FD2E29 mov dword ptr [ebp-3Ch],eax
00FD2E2C nop
00FD2E2D jmp 00FD2E2F
有11個彙編指令第一個方法與第二個方法的9個彙編指令。有更多的指針內存操作。
恕我直言最好的檢查這個的方法是編譯並查看編譯器生成的中間語言代碼。但我認爲A方法聲明瞭兩個引用foreach和B方法只有一個。因爲回報是一個參考。 – Turrican
正如@Turrican建議的那樣 - 查看使用ILDASM或調試器反彙編窗口生成的代碼。您可能會發現編譯器將第一個代碼優化爲與第二個代碼相同。 – PaulF
Idk在'C#'中,但是在'Java'中,如果你設置了編譯器警告來詳細說明它會抱怨你的第一塊代碼,說明變量'myObject'是無用的,因此你應該直接返回值。這很可能同樣適用於'C#' – RafaelC