我找到了「可選參數」功能,在C#4.0很有意思,所以我試圖找出他們如何使之成爲現實。 所以我寫了這樣的方法:MSIL中的[opt]是什麼意思?
private static void A(int a = 5) { }
編譯它,然後在IL DASM反編譯它,這是IL代碼:
.method private hidebysig static void A([opt] int32 a) cil managed
{
.param [1] = int32(0x00000005)
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::A
它已得到這在它的元數據:
(1)ParamToken:(08000002)名稱:一個標誌:[可選] [HasDefault(00001010)默認值:(I4)5
所以我也跟着線索,並寫了一個方法是這樣的:
private static void B([Optional, DefaultParameterValue(78)]int b) { }
編譯並反編譯它,我發現C#編譯器爲方法A和B(名稱除外)生成幾乎相同的MSIL代碼。
正如我們可以看到有沒有在IL代碼屬性的跡象,感覺不對,所以我寫了這樣的自定義屬性:
[AttributeUsage(AttributeTargets.Parameter)]
public class MyTestAttribute : Attribute
{
}
然後在這樣的方法C中使用它:
private static void C([MyTest]int c) { }
編譯,然後反編譯它,哈,我發現這一點:
.method private hidebysig static void C(int32 c) cil managed
{
.param [1]
.custom instance void ConsoleApplication1.MyTestAttribute::.ctor() = (01 00 00 00)
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::C
的第二行方法體調用我的自定義屬性的ctor。
所以這導致了我的疑惑:
- 是什麼[選擇]是什麼意思?我的意思是出現在方法A和B的參數前面的那個。
- 怎麼來的方法C調用被應用到它的參數和方法A和B沒有屬性的構造函數?
- 我似乎無法找到在元數據DefaultParameterValueAttribute的跡象,但我能找到OptionalAttribute和MyTestAttribute。這是爲什麼?有什麼我失蹤了嗎?
在此先感謝。
謝謝,我沒想到能儘快得到答案。但你的看起來像那個。 – CuiPengFei 2011-03-31 09:42:34
而我一直在考慮優化意味着優化... – CuiPengFei 2011-03-31 09:50:46
哇,沒想到找到了一個CSC的bug。 – CuiPengFei 2011-04-01 08:06:03