Programcılar tarafından yaygın olarak kullanılan genel mekanizma ile nasıl oynanır?

Yazar | Zhu Gang, sorumlu editör | Guo Rui

Baş resmi | Oriental IC'den CSDN indirme

Üretildi | CSDN (ID: CSDNnews)

Geliştiriciler genellikle jenerik kullanır ve çoğu geliştirici jenerikleri iyi kullanır. Jenerikler, temeldeki çalışma zamanının desteğine ihtiyaç duyar. Jenerik sınıflardaki tür parametreleri meta veri haline gelir. Çalışma zamanında ihtiyaç duyulduğunda uygun sınıfları oluşturmak için kullanılırlar. Bu nedenle, jenerikler kalıtımı, polimorfizmi ve kapsüllemeyi destekler. Jeneriklerin derinlemesine bilgisinden kısaca bahsedecek olursak, jeneriklerin iç mekanizmasına bir göz atalım.

CIL, jenerik anlamına gelir

Jenerik sınıf derlendikten sonra, sıradan sınıfın derlenmiş sonucu arasında pek bir fark yoktur.Sonuç CIL ve meta veridir.Tek fark, CIL'in derlenen sonucun genel bir sınıf olduğunu belirtmek için özel bir işaret kullanmasıdır. Derleme sonucuna bir örnek üzerinden bakalım.

genel sınıf Demo < T > nerede T: IComparable { // daha fazla kod T öğesi; // daha fazla kod }

Yukarıdaki kod, bir tür parametresi içeren bir Demo genel sınıfını tanımlar. Mutasyondan sonra nihayet oluşturulan parametreli CIL kodu aşağıdaki gibidir:

.class özel oto ansi öncefieldinit Demo'1 < System.IComparable) T > System.Object'i genişletir { // daha fazla CIL kodu .field özel! 0 ürün // daha fazla CIL kodu }

Yukarıdaki parametreleştirilmiş CIL kodunda, Demodan sonra bir '1' göründüğünü görüyoruz.Bu parametre sayısı olan argüman sayısı olarak adlandırılır. Jenerik bir sınıfı bildirirken gerekli olan tip argümanlarının sayısını temsil eder.Yukarıdaki örnek sadece bir tip olduğu içindir. Parametreler Bu nedenle, Demo ise ihtiyaç duyduğu tür bağımsız değişkenlerinin sayısı 1'dir. < TKey, TValue, Tother > Böyle genel bir sınıf durumunda, üretilen parametreli CIL kodundaki tür parametrelerinin sayısı 3'tür ve bu '3 olarak gösterilir. Sınıfa uygulanan kısıtlamalar, parametreli CIL kodunda, yani System.IComparable'da gösterilir. Aynı zamanda, CIL kodu,! Kullanarak, tanımlanmış T türü dizi bildirimini değiştirir. Bir tür parametresi eklemek için. Yukarıda bahsedilen üç nokta dışında, üretilen CIL kodu, sıradan sınıflar tarafından üretilen koddan farklı değildir.

Değer türü genel örnekleme

Bir tür parametresi olarak bir değer türüne sahip genel bir tür oluştururken, yenidenleştirilmiş bir genel tür oluşturmak için, çalışma zamanı belirtilen tür parametresini CIL'nin uygun konumuna yerleştirir.

Önceki bölümde tanımlanan genel sınıfı Demo'yu ilk kez çağırdığımızda ve tür argümanı olarak Demo'ya ilettiğimizde, çalışma zamanı Demo'nun somut bir sürümünü oluşturacak ve tür parametrelerini int ile değiştirecektir. Yani Demo'yu her kullandığınızda < int > Çalışırken, oluşturulan reification sınıfı Demo'yu yeniden kullanacak < int > . Burada, üretilen şeyleştirme sınıfının yalnızca tür bağımsız değişkeninin int olduğu durum için olduğuna dikkat edilmelidir.Şu anda tür bağımsız değişkeni olarak float içeren bir Demo tanımlanırsa, çalışma zamanında başka bir genel tür üretilecektir. versiyon.

Değer türü genel örneklerinin kullanılması kod dönüştürme ve kutulama işlemlerini önleyebilir ve performansı artırabilir, ancak kullanım sürecinde, değer türü jeneriklerinin kullanılıp kullanılmayacağına ve bunların belirli kodlara, özel koşullara ve belirli öğelere göre nasıl kullanılacağına da karar vermek gerekir.

İpucu: Çalışma zamanında, her yeni salt tür parametresi için belirli bir genel tür oluşturulur.

Başvuru türü genel örnekleme

Genel örnekler, tür bağımsız değişkenleri olarak başvuru türlerini kullandıklarında değer türlerinden biraz farklıdır. Genel bir tür oluştururken, çalışma zamanı, yeniden tanımlanmış genel bir tür oluşturmak için CIL kodundaki tür parametresini değiştirmek için nesne başvurusunu kullanır.Yapılan türü somutlaştırmak için bir başvuru türü parametresi her kullanıldığında, çalışma zamanı oluşturulan türü yeniden kullanır. Sürüm: Sağlanan başvuru türü, genel türü oluştururken başvuru türünden farklıysa, yine de oluşturulan sürümü kullanacağını unutmayın. Bir örneğe bakalım:

Demo < Kullanıcı > userDemo; Demo < Öğrenci > studentDemo;

İlk olarak, kod ilk satırda çalıştığında, çalışma sırasında Demo'nun somutlaştırılmış bir sürümü üretilecektir.CIL, Kullanıcıyı belirtilen veri türü olarak depolamayacak, ancak nesne referanslarını saklayacaktır. Daha sonra kod ikinci satıra çalıştığında, Öğrenci ve Kullanıcı referansları farklı olmasına rağmen, CIL, Student'ın yeni bir somutlaştırılmış sürümünü oluşturmayacak, ancak daha önce nesne referansına verilen Demo örneğini başlatacaktır. Tabii ki, tip güvenliğini sağlamak için, CIL, tip parametresinin her bir nesne referansını bu hafıza alanına değiştirmek için Order tipinde bir hafıza alanı tahsis edecektir. Referans türü jeneriklerini kullanmanın avantajı, derleyicinin oluşturduğu materyalleştirilmiş sınıfları bire sıkıştırması, böylece kod miktarını büyük ölçüde azaltması ve kod performansını artırmasıdır.

Başvuru türü türü parametresinin, değiştiğinde çalışma zamanında aynı dahili genel tür tanımını kullandığı, ancak aşağıdaki durumlar meydana gelirse, aynı dahili genel tür tanımının uygulanmayacağı burada belirtilmelidir.

Demo < int, Kullanıcı > userDemo; Demo < uzun, Kullanıcı > userLongDemo; Demo < Kılavuz, Kullanıcı > userGuidDemo;

Yukarıdaki kodda, tip parametresi bir değer tipi içerir Bu durumda, aynı dahili jenerik tip tanımı kullanılmayacak, ancak her Demo için farklı bir dahili tip tanımı oluşturulacaktır.

özet

Bu makale kısa olmasına rağmen, jenerik mekanizmanın iç ilkelerini ve ilgili önlemleri tam olarak açıklamaktadır. NET'te jeneriklerin en iyisi olduğu söylenebilir. Java'da jeneriklerin kullanımı, JVM'de değil, tamamen derleyicide uygulanır. Bu, jeneriklerin kullanımını engelleyebilir ve yeni JVM'leri dağıtabilir, ancak Değer türleri ve referans türleri arasında ayrım yapmaz, bu nedenle yürütme verimliliği düşüktür ve yansıtma işlevlerinin kullanımını etkiler.

Yazar: Zhu Steel, .NET üst düzey geliştirme mühendisi, 7 yıllık ön cephe geliştirme deneyimi, e-devlet sistemlerinin ve AI müşteri hizmetleri sistemlerinin ve İnternet işe alım sitesi mimarisinin geliştirilmesine katıldı, şu anda Beijing Chong Heng Rong-hui Technology Development Co., Ltd.

Sorumluluk Reddi: Bu makale yazar tarafından orijinal bir gönderidir, lütfen izinsiz yeniden basmayın.

Bir yüz yıllık IBM nihayet All In yapay zeka ve hibrit bulutta!

Microsoft, Apple, Google, Samsung ... Blok zincirindeki bu teknoloji devleri şimdiden çok şey yaptı!

GitHub 2000+ Star'ı edinerek, Aliyun'un açık kaynak Alink makine öğrenimi platformu çift 11 veri "oyunundan" nasıl daha iyi performans gösteriyor? | AI teknolojisi ekolojisi

Microsoft bir kişi için bir şirket mi satın alıyor? Sony programlarını kırın, hacker romanları yazın ve sağlam program hayatını izleyin!

Makine öğrenimi proje şablonu: Makine öğrenimi projesinin 6 temel adımı

IBM, Microsoft, Apple, Google, Samsung ... blok zincirindeki teknoloji devleri şimdiden çok şey yaptı!

Kıdemli programcının özeti: Linux sürecini analiz etmek için 6 yöntem, size hepsini anlatacağım

Bugünün refahı: yorum alanı seçildi, çevrimiçi 299 yuan değerinde "2020 AI Geliştiricileri Konferansı" nı alabilirsiniz Bir canlı bilet . Parmaklarınızı hareket ettirin ve söylemek istediklerinizi yazın.

Sektörün ilk gerçek zamanlı ışın izleme teknolojisi mobil oyunlara uygulandı!
önceki
Veritabanı CURD işlemini uygulamak için Mybatis nasıl kullanılır?
Sonraki
Zhou Hongyi tarafından tüm ağda engellenen 360 amansız general: tabandan gelen bir karşı saldırı, net değeri yüz milyonlarca olan 36 yaşına kadar çalışıyor.
Büyük ölçekli bir Web arama motoru mimarisi nasıl başarıyla oluşturulur?
Gartner'ın 1 numaralı konteyner ürününü kazanan Alibaba Cloud, bulut yerel savaşını kazandı
Huawei, 4188 yuan fiyatıyla P40 serisinin National Bank versiyonunu yayınladı; DJI "en az% 50 işten çıkarmalar ve temizlik planına" yanıt verdi; Firefox 75 yayınlandı
Temelleri zayıf olan programcılara ne oldu?
10 kat HD maliyeti yok! SVG oluşturma
Sıcak arama! Huawei: Bu tür programcılar 1 milyara öncülük ediyor Programcılar: Çok güzel kokulu! Ne düşünüyorsun?
Luo Yonghao: Bu yıl kırk sekiz yaşındayım ve sayısız hataya dayanabilirim; iOS14 sistem düzeyinde bir "küçük program" işlevi başlatabilir; PyCharm'ın yeni sürümü yayınlandı | Geek Headlines
Dikkatli değilseniz, RPC'nin zaman aşımı ayarı çevrimiçi bir kazadır
Excel zayıf! Bu araç günlük çalışmamı 30 dakikada tamamladı ve sıfır temel ile öğrenebilirim
Dijital dönüşüm eş için çok mu zor? AI ve IoT sert vuruşlar yapıyor
Uluslararası öğrenciler yurt dışından dönüşlerini gizleyip düğünlere katılarak yüzlerce insanın karantinaya alınmasına neden oldu
To Top