Aracılığıyla paylaş


Visual Basic'te genel türler (Visual Basic)

genel tür, birden çok veri türü için aynı işlevselliği gerçekleştirmek üzere uyarlanan tek bir programlama öğesidir. Genel bir sınıf veya yordam tanımlarken, bu işlevselliği gerçekleştirmek isteyebileceğiniz her veri türü için ayrı bir sürüm tanımlamanız gerekmez.

Benzetme, çıkarılabilir kafalara sahip bir tornavida setidir. Vidayı inceler ve bu vida için doğru başlığı seçersiniz (yuvarlanmış, çapraz, yıldızlı). Tornavida tutamacına doğru başlığı yerleştirdikten sonra, aynı işlevi tornavidayla, yani vidayı çevirerek gerçekleştirirsiniz.

Farklı kafalara sahip bir tornavida kümesinin diyagramı.

Genel bir tür tanımladığınızda, bunu bir veya daha fazla veri türüyle parametreleştirirsiniz. Tür parametreleri, kodun veri türlerini gereksinimlerine göre uyarlamasına olanak sağlar. Kodunuz, her biri farklı bir veri türü kümesi üzerinde hareket eden genel öğeden birkaç farklı programlama öğesi bildirebilir. Ancak bildirilen öğelerin tümü, hangi veri türlerini kullanırlarsa kullansınlar aynı mantığı gerçekleştirir.

Örneğin, Stringgibi belirli bir veri türü üzerinde çalışan bir kuyruk sınıfı oluşturmak ve kullanmak isteyebilirsiniz. Aşağıdaki örnekte gösterildiği gibi, System.Collections.Generic.Queue<T>'den böyle bir sınıf bildirebilirsiniz.

Public stringQ As New System.Collections.Generic.Queue(Of String)

Artık yalnızca String değerlerle çalışmak için stringQ kullanabilirsiniz. stringQ, Object değerleri için genelleştirilmek yerine String'e özel olduğu için, geç bağlama veya tür dönüşümü yapmazsınız. Genel türler yürütme zamanından tasarruf eder ve çalışma zamanı hatalarını azaltır.

Genel bir türü kullanma hakkında daha fazla bilgi için bkz. Genel Bir Sınıfı Kullanma Yolu.

Genel sınıf örneği

Aşağıdaki örnekte genel bir sınıfın iskelet tanımı gösterilmektedir.

Public Class classHolder(Of t)
    Public Sub processNewItem(ByVal newItem As t)
        Dim tempItem As t
        ' Insert code that processes an item of data type t.
    End Sub
End Class

Önceki iskelette, t bir tür parametresi olan'dir, yani sınıfı bildirirken sağladığınız bir veri türü için yer tutucudur. Kodunuzun başka bir yerinde, tiçin çeşitli veri türleri sağlayarak classHolder çeşitli sürümlerini bildirebilirsiniz. Aşağıdaki örnekte bu tür iki bildirim gösterilmektedir.

Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)

Yukarıdaki ifadeler, yapılı sınıfları, tür parametresinin yerini belirli bir türün aldığı sınıflar olarak bildirir. Bu değiştirme, oluşturulmuş sınıf içindeki koda yayılır. Aşağıdaki örnekte, processNewItem yordamının integerClassiçinde nasıl göründüğü gösterilmektedir.

Public Sub processNewItem(ByVal newItem As Integer)
    Dim tempItem As Integer
    ' Inserted code now processes an Integer item.
End Sub

Daha eksiksiz bir örnek için bkz. Nasıl yapılır:Farklı Veri Türlerinde Aynı İşlevselliği Sağlayabilecek Bir Sınıf Tanımlama.

Uygun programlama öğeleri

Genel sınıfları, yapıları, arabirimleri, yordamları ve temsilcileri tanımlayabilir ve kullanabilirsiniz. .NET, yaygın olarak kullanılan genel öğeleri temsil eden çeşitli genel sınıfları, yapıları ve arabirimleri tanımlar. System.Collections.Generic ad alanı sözlükler, listeler, kuyruklar ve yığınlar sağlar. Kendi genel öğenizi tanımlamadan önce, System.Collections.Genericiçinde zaten kullanılabilir olup olmadığını görün.

Yordamlar tür değildir, ancak genele yönelik yordamları tanımlayabilir ve kullanabilirsiniz. Bkz. Visual Basic Genel Yordamları.

Genel türlerin avantajları

Genel bir tür, her biri belirli bir veri türü üzerinde çalışan birkaç farklı programlama öğesini bildirmek için bir temel görevi görür. Genel bir türün alternatifleri şunlardır:

  1. Object veri türünde çalışan tek bir tür.
  2. türüne özgü sürümlerinden oluşan bir küme. Her sürüm ayrı ayrı kodlanır ve String, Integergibi belirli bir veri türü veya customergibi kullanıcı tanımlı bir tür üzerinde çalışır.

Genel bir tür, bu alternatiflere göre aşağıdaki avantajlara sahiptir:

  • Tür Güvenliği. Genel türler derleme zamanı tür denetimini sağlar. Object herhangi bir veri türünü kabul eden türler ve giriş veri türünün kabul edilebilir olup olmadığını denetlemek için kod yazmanız gerekir. Genel türlerle, derleyici çalışma zamanından önce tür uyuşmazlıklarını yakalayabilir.
  • Performans. Genel türlerin kutu ve kutu verileri kaldırması gerekmez çünkü her biri bir veri türü için özeldir. Object tabanlı işlemler, giriş veri türlerini Object'e dönüştürmek için kutulanmalı ve çıkışa yönelik verileri kutudan çıkarmalıdır. Kutulama ve kutu açma işlemleri performansı düşürür. Object temel alan türler de geç bağlıdır, yani üyelerine erişim için çalışma zamanında ek kod gerekir. Tür dönüştürmeleri performansı da azaltır.
  • Kod Birleştirme. Genel türdeki kodun yalnızca bir kez tanımlanması gerekir. Bir türün türe özgü sürümleri kümesinin her sürümde aynı kodu çoğaltması gerekir ve tek fark bu sürüme özgü veri türüdür. Genel türlerle, türe özgü sürümlerin tümü özgün genel türden oluşturulur.
  • Kodu Yeniden Kullanma. Belirli bir veri türüne bağımlı olmayan kod, genelse çeşitli veri türleriyle yeniden kullanılabilir. Bunu genellikle başlangıçta tahmin etmediğiniz bir veri türüyle bile yeniden kullanabilirsiniz.
  • IDE Desteği. Genel bir türden bildirilen bir yapı türü kullandığınızda, tümleşik geliştirme ortamı (IDE) kodunuzu geliştirirken size daha fazla destek verebilir. Örneğin, IntelliSense bir oluşturucunun veya yöntemin bağımsız değişkeni için türe özgü seçenekleri gösterebilir.
  • Genel Algoritmalar. Türden bağımsız soyut algoritmalar genel türler için iyi adaylardır. Örneğin, IComparable arabirimini kullanarak öğeleri sıralayan genel bir yordam, IComparableuygulayan herhangi bir veri türüyle kullanılabilir.

Kısıtlama -ları

Genel tür tanımındaki kod mümkün olduğunca türden bağımsız olmalıdır, ancak genel türünüz için sağlanan herhangi bir veri türünün belirli bir özelliğini gerekli kılabilir. Örneğin, sıralamak veya harmanlamak için iki öğeyi karşılaştırmak istiyorsanız, veri türlerinin IComparable arabirimini uygulaması gerekir. Tür parametresine kısıtlama ekleyerek bu gereksinimi zorunlu kılabilirsiniz.

Kısıtlama örneği

Aşağıdaki örnek, tür bağımsız değişkeninin IComparable'ı uygulamasını gerektiren bir kısıtlamaya sahip bir sınıfın iskelet tanımını gösterir.

Public Class itemManager(Of t As IComparable)
    ' Insert code that defines class members.
End Class

Sonraki kod, IComparableuygulamayan bir tür sağlayan itemManager'den bir sınıf oluşturmayı denerse, derleyici bir hata sinyali gönderir.

Kısıtlama türleri

Kısıtlamanız herhangi bir birleşimde aşağıdaki gereksinimleri belirtebilir:

  • Tür bağımsız değişkeninin bir veya daha fazla arabirim uygulaması gerekir
  • Tür bağımsız değişkeni, en fazla bir sınıfın türünde olmalı veya ondan devralınmalıdır.
  • Tür bağımsız değişkeni, nesne oluşturan kod tarafından erişilebilen parametresiz bir oluşturucuyu kullanıma sunmalıdır
  • Tür bağımsız değişkeni, bir başvuru türü olmalı ya da bir değer türü olmalıdır.

C# kodu, bir tür bağımsız değişkeninin yönetilmeyen türolması gerektiğini bildirebilir. Visual Basic, bu kısıtlamayla tanımlanan genel bir tür veya yöntem kullanan Visual Basic kodu için bu kısıtlamayı uygular (C# dilinde). Ancak, Visual Basic'te bir tür parametresinde unmanaged kısıtlaması bildiremezsiniz.

Birden fazla gereksinim uygulamanız gerekiyorsa, küme ayraçlarının ({ }) içinde virgülle ayrılmış kısıtlama listesi kullanırsınız. Erişilebilir bir oluşturucu gerektirmek için Yeni İşleç anahtar sözcüğünü listeye eklersiniz. Başvuru türü gerektirmek için Class anahtar sözcüğünü eklersiniz; bir değer türü gerektirmek için Structure anahtar sözcüğünü eklersiniz.

Kısıtlamalar hakkında daha fazla bilgi için bkz. Tür Listesi.

Birden çok kısıtlama örneği

Aşağıdaki örnek, tür parametresinde kısıtlama listesi olan genel bir sınıfın iskelet tanımını gösterir. Bu sınıfın bir örneğini oluşturan kodda tür bağımsız değişkeninin hem IComparable hem de IDisposable arabirimlerini uygulaması, başvuru türü olması ve erişilebilir bir parametresiz oluşturucuyu kullanıma sunması gerekir.

Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
    ' Insert code that defines class members.
End Class

Önemli terimler

Genel türler aşağıdaki terimleri tanıtır ve kullanır:

  • Genel Tür. Bildirdiğinizde en az bir veri türü sağladığınız bir sınıf, yapı, arabirim, yordam veya temsilci tanımı.
  • Tür Parametresi. Genel tür tanımında, türü bildirdiğinizde sağladığınız bir veri türü için yer tutucu.
  • Tür Bağımsız Değişkeni. Genel bir türden bir tür oluşturulduğunda tür parametresinin yerini alan belirli bir veri türü.
  • Kısıtlama. Tür parametresinde, bunun için sağlayabildiğiniz tür bağımsız değişkenini kısıtlayan bir koşul. Bir kısıtlama, tür bağımsız değişkeninin belirli bir arabirimi uygulamasını, belirli bir sınıftan devralmasını, erişilebilir bir parametresiz oluşturucuya sahip olmasını veya başvuru türü ya da değer türü olmasını gerektirebilir. Bu kısıtlamaları birleştirebilirsiniz, ancak en fazla bir temel sınıf belirtebilirsiniz.
  • Oluşturulmuş Tür. Tür parametreleri için tür bağımsız değişkenleri sağlayarak genel bir türden bildirilen bir sınıf, yapı, arabirim, yordam veya temsilci.

Ayrıca bkz.