0, Microsoft Ara Dilinde (MSIL) neden bir türdür?


90

Birçok MSIL listesinde aşağıdakileri gözlemledim:

System.Nullable`1<!0> etc ...

veya

class !0 etc ...

!0Bu koşullarda ne anlamı var ?

Yanıtlar:


120

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 .

!nGenel 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.


35

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).


5
TryRoslyn kullanırsam anlamıyorum ... goo.gl/ZZKE38 Anlıyorum !Tve !!Tjenerik parametrenin kapsayıcı sınıftan mı yoksa yöntemden mi olduğuna bağlı olarak ... ildasm
xanatos

@xanatos Her zaman değil. Ayrıca ldfld class System.Collections.Generic.Dictionary``2<!0, !1> valuetype System.Collections.Generic.Dictionary``2/Enumerator<!TKey, !TValue>::dictionaryveya 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 !TKeyzaten IL'yi daha okunaklı hale getirme çabasıdır. Belki her zaman iyi çalışmaz? ECMA özellikleri her zaman konumsal !0/ !00aynı zamanda kullanır .
Luaan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.