C# 4.0'deki "isteğe bağlı parametreler" özelliğini çok ilginç buldum, bu yüzden nasıl yapıldığını anlamaya çalıştım. yüzden böyle bir yöntem yazdı: o zaman,MSIL'de [opt] ne anlama geliyor?
private static void A(int a = 5) { }
bunu Derleyen IL DASM bunu bozulamaz, bu IL kod şudur:
.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
Ve onun metaverilerde bu var:
(1) ParamToken: (08000002) Adı: bir bayraklar: [İsteğe bağlı] [HasDefault] (00001010) Varsayılan: (I4) 5
Yani ipucunu takip etti ve böyle bir yöntemi yazdı:
private static void B([Optional, DefaultParameterValue(78)]int b) { }
derlenmiş ve dönüştürülemez, ve C# derleyicisi (adı hariç), yöntem A ve B için hemen hemen aynı msil üretilen kod bulundu.
orada IL kodunda özelliklerin hiçbir iz ve bu yanlış geldi, bu yüzden böyle özel bir özellik yazdı görebileceğiniz gibi: Sonra
[AttributeUsage(AttributeTargets.Parameter)]
public class MyTestAttribute : Attribute
{
}
böyle bir yöntem C kullandı:
private static void C([MyTest]int c) { }
bunu Derleyen ve sonra decompiled onu ve hah, bunu buldum:
.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
ikinci satırı yöntem gövdesi, özel özniteliğimin ctor çağırır.
Yani bu benim şüpheleri yol açar:- [opt] ne anlama gelir? A ve B parametresinin önünde görünen kelimeyi kastediyorum.
- Yöntem C, parametresine uygulanan Attribute öğesinin yapıcısını ve A ve B yöntemini nasıl çağırmaz?
- Meta verilerde herhangi bir DefaultParameterValueAttribute belirtisi göremiyorum, ancak OptionalAttribute ve MyTestAttribute öğelerini bulabilirim. Neden? Kaybettiğim bir şey var mı?
Şimdiden teşekkürler.
Bu yazının bir kısmı çok yakında yanıt almayı beklemiyordum. Ama seninki gibi görünüyor. – CuiPengFei
Ve ben opt optimated anlamına gelir düşünüyorum ... – CuiPengFei
Vay, bir CSC bir hata bulmak için beklemiyorduk. – CuiPengFei