Birçok MSIL listesinde aşağıdakileri gözlemledim:
System.Nullable`1<!0> etc ...
veya
class !0 etc ...
!0
Bu koşullarda ne anlamı var ?
Yanıtlar:
Bu, .NET derlemesine bakmak için kullandığınız derleyicinin tuhaflığıdır. Bu ildasm.exe'nin davranışıdır, Reflector veya ILSpy gibi diğerleri bunu doğru anlar. Bunu yazan Microsoft programcısı bir kısayol kullandı, IL'den , meta verilerde tür bağımsız değişkeni adını aramak için ekstra kod yazmadan, kodlandığı şekilde yalnızca tür bağımsız değişkenini görüntüleyen bir dize oluşturur .
!n
Genel türün n'inci tür bağımsız değişkenini okumanız gerekir . Burada! 0 "birinci tür bağımsız değişken",! 1 ise "ikinci tür bağımsız değişken" anlamına gelir, vb. Nullable <> için, MSDN makalesinde "! 0" ın "T" anlamına geldiğini biliyorsunuz.
Ayrıca gibi bir şeyle de karşılaşabilirsiniz !!T
. İki ünlem işareti, genel bir yöntem için bir tür bağımsız değişkenini gösterir . Bu kez, ildasm.exe gelmez kullanmak yerine tip argüman adı aramak !!0
. Programcı neden jenerik türlerde kısayolu seçti, ancak genel yöntemlerde tersine mühendislik yapmak zordur. Ildasm oldukça ilginç bir programdır ve .NET'teki diğer C ++ kodlarından çok farklı bir C ++ kodlama stilinde yazılmıştır. Disiplinli değil, bunun bir stajyerin görevi olduğu sıfırdan farklı değil :)
"Nullable" üzerindeki "1 soneki, genel tür adları için normal bir kodlamadır, genel türün bir tür bağımsız değişkeni olduğunu gösterir. Başka bir deyişle, Nullable <> için! 1 kullanıldığını asla göremezsiniz.
Yani basitçe !0
"T" olarak okuyun . Veya daha iyi bir derleyici kullanın.
Bu genel bir tür parametresidir.
Konumsaldırlar.
Nasıl kullanıldıklarını görmek için bazı genel kodların derlemesini çözün (IL ve C # ile karşılaştırın).
ldfld class System.Collections.Generic.Dictionary``2<!0, !1> valuetype System.Collections.Generic.Dictionary``2/Enumerator<!TKey, !TValue>::dictionary
veya gibi bir kod görüyorum call instance void class System.Collections.Generic.Dictionary``2<!TKey, !TValue>::Insert(!0, !1, bool)
. Ham IL, yine de yalnızca konumsal argümanı kullanır - bu !TKey
zaten IL'yi daha okunaklı hale getirme çabasıdır. Belki her zaman iyi çalışmaz? ECMA özellikleri her zaman konumsal !0
/ !00
aynı zamanda kullanır .
!T
ve!!T
jenerik parametrenin kapsayıcı sınıftan mı yoksa yöntemden mi olduğuna bağlı olarak ... ildasm