既然C#支持命名參數,我正在檢查它是否以與VB相同的方式實現,並發現它們之間存在細微差別。舉個例子,庫函數是這樣的:C#和VB如何處理命名參數之間的區別?
public static void Foo(string a, string b)
{
Console.WriteLine(string.Format("a: {0}, b: {1}", a, b));
}
在C#中,如果你這樣稱呼它:
Foo(a: "a", b: "b");
編譯器生成以下IL指令:
.locals init (
[0] string CS$0$0000,
[1] string CS$0$0001)
L_0000: nop
L_0001: ldstr "a"
L_0006: stloc.0
L_0007: ldstr "b"
L_000c: stloc.1
L_000d: ldloc.0
L_000e: ldloc.1
L_000f: call void [TestLibrary]TestLibrary.Test::Foo(string, string)
L_0014: nop
L_0015: ret
轉換爲以下C#代碼:
string CS$0$0000 = "a";
string CS$0$0001 = "b";
Test.Foo(CS$0$0000, CS$0$0001);
在VB中,如果你這樣稱呼它:
Foo(a:="a", b:="b")
編譯器生成以下IL指令:
L_0000: nop
L_0001: ldstr "a"
L_0006: ldstr "b"
L_000b: call void [TestLibrary]TestLibrary.Test::Foo(string, string)
L_0010: nop
L_0011: nop
L_0012: ret
它轉換爲以下VB代碼:
Foo("a", "b");
VB的方式需要少得多的指令調用,那麼C#實現它的方式會有什麼優勢嗎?如果您不使用命名參數,則C#會產生與VB相同的內容。
編輯:現在,我們已經確定了額外的指令在發佈模式走,是有什麼特別的理由來讓他們出現在調試模式? VB在這兩種模式下的作用相同,並且在沒有命名參數(包括使用可選參數)的情況下正常調用方法時,C#不會插入額外的指令。
開關順序(:= 「B」,A:B = 「一個」)以查看差(提示:副作用順序) – adrianm 2010-02-25 05:11:33
什麼是等效VB代碼? – 2010-02-25 05:15:52
@adrianm一個有趣的想法,但我剛剛嘗試過(出於好奇),併產生與'Foo(a:「a」,b:「b」)相同的IL;' – 2010-02-25 05:18:28