Anonim Türleri (Visual Basic)

Visual Basic, veri türü için bir sınıf tanımı yazmadan nesne oluşturmanızı sağlayan anonim türleri destekler. Bunun yerine, derleyici sizin için bir sınıf oluşturur. sınıfının kullanılabilir bir adı yoktur, doğrudan öğesinden Objectdevralır ve nesnesini bildirirken belirttiğiniz özellikleri içerir. Veri türünün adı belirtilmediğinden anonim tür olarak adlandırılır.

Aşağıdaki örnek, ve adlı iki özelliğe Name sahip anonim bir türün örneği olarak değişken product bildirir ve Priceoluşturur.

' Variable product is an instance of a simple anonymous type.
Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

Sorgu ifadesi , bir sorgu tarafından seçilen veri sütunlarını birleştirmek için anonim türler kullanır. Belirli bir sorgunun seçebileceği sütunları tahmin edemeyeceğiniz için sonucun türünü önceden tanımlayamazsınız. Anonim türler, istediğiniz sayıda sütunu herhangi bir sırada seçen bir sorgu yazmanızı sağlar. Derleyici, belirtilen özelliklerle ve belirtilen sırayla eşleşen bir veri türü oluşturur.

Aşağıdaki örneklerde, products her biri birçok özelliğe sahip olan ürün nesnelerinin listesi verilmiştir. Değişken namePriceQuery , yürütüldüğünde, ve adlı iki özelliğe NamePricesahip anonim bir türdeki örneklerin koleksiyonunu döndüren sorgunun tanımını tutar.

Dim namePriceQuery = From prod In products
                     Select prod.Name, prod.Price

Değişken nameQuantityQuery , yürütüldüğünde, ve adlı iki özelliğe NameOnHandsahip anonim bir türdeki örneklerin koleksiyonunu döndüren sorgunun tanımını tutar.

Dim nameQuantityQuery = From prod In products
                        Select prod.Name, prod.OnHand

Derleyici tarafından anonim bir tür için oluşturulan kod hakkında daha fazla bilgi için bkz . Anonim Tür Tanımı.

Dikkat

Anonim türün adı derleyici oluşturulur ve derlemeden derlemeye farklılık gösterebilir. Proje yeniden derlendiğinde ad değişebileceğinden kodunuz anonim bir türü kullanmamalı veya bu adı kullanmamalıdır.

Anonim Tür Bildirme

Anonim türün bir örneğinin bildirimi, türün özelliklerini belirtmek için bir başlatıcı listesi kullanır. Yalnızca anonim bir tür bildirdiğinizde özellikleri belirtebilir, yöntemler veya olaylar gibi diğer sınıf öğelerini belirtemezsiniz. Aşağıdaki örnekte, product1 iki özelliği olan anonim bir türün örneğidir: Name ve Price.

' Variable product1 is an instance of a simple anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
' -or-
' product2 is an instance of an anonymous type with key properties.
Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}

Özellikleri anahtar özellikler olarak belirlerseniz, bunları iki anonim tür örneğini eşitlik için karşılaştırmak için kullanabilirsiniz. Ancak, anahtar özelliklerin değerleri değiştirilemez. Daha fazla bilgi için bu konunun devamında yer alan Anahtar Özellikler bölümüne bakın.

Anonim bir türün örneğini bildirmenin, bir nesne başlatıcı kullanarak adlandırılmış bir türün örneğini bildirmeye benzer olduğuna dikkat edin:

' Variable product3 is an instance of a class named Product.
Dim product3 = New Product With {.Name = "paperclips", .Price = 1.29}

Anonim tür özelliklerini belirtmenin diğer yolları hakkında daha fazla bilgi için bkz . Nasıl yapılır: Anonim Tür Bildirimlerinde Özellik Adlarını ve Türlerini Çıkarma.

Anahtar Özellikler

Anahtar özellikleri, anahtar olmayan özelliklerden çeşitli temel yollarla farklılık gösterir:

  • İki örneğin eşit olup olmadığını belirlemek için yalnızca anahtar özelliklerin değerleri karşılaştırılır.

  • Anahtar özelliklerin değerleri salt okunur ve değiştirilemez.

  • Anonim bir tür için derleyici tarafından oluşturulan karma kod algoritmasına yalnızca anahtar özellik değerleri eklenir.

Eşitlik

Anonim türlerin örnekleri yalnızca aynı anonim türdeki örneklerse eşit olabilir. Derleyici, aşağıdaki koşulları karşılıyorsa iki örneği aynı türde örnekler olarak ele yapar:

  • Bunlar aynı derlemede bildirilir.

  • Özellikleri aynı adlara, aynı çıkarsanan türlere sahiptir ve aynı sırada bildirilir. Ad karşılaştırmaları büyük/küçük harfe duyarlı değildir.

  • Her birindeki aynı özellikler anahtar özellikler olarak işaretlenir.

  • Her bildirimdeki en az bir özellik anahtar özelliktir.

Anahtar özellikleri olmayan anonim türlerin bir örneği yalnızca kendisine eşittir.

' prod1 and prod2 have no key values.
Dim prod1 = New With {.Name = "paperclips", .Price = 1.29}
Dim prod2 = New With {.Name = "paperclips", .Price = 1.29}

' The following line displays False, because prod1 and prod2 have no
' key properties.
Console.WriteLine(prod1.Equals(prod2))

' The following statement displays True because prod1 is equal to itself.
Console.WriteLine(prod1.Equals(prod1))

Anahtar özelliklerinin değerleri eşitse, aynı anonim türün iki örneği eşittir. Aşağıdaki örneklerde eşitliğin nasıl test edilmiş olduğu gösterilmektedir.

Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29}
' The following line displays True, because prod3 and prod4 are
' instances of the same anonymous type, and the values of their
' key properties are equal.
Console.WriteLine(prod3.Equals(prod4))

Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 423}
' The following line displays False, because prod5 and prod6 do not 
' have the same properties.
Console.WriteLine(prod5.Equals(prod6))

Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 24}
Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29,
                      .OnHand = 423}
' The following line displays True, because prod7 and prod8 are
' instances of the same anonymous type, and the values of their
' key properties are equal. The equality check does not compare the
' values of the non-key field.
Console.WriteLine(prod7.Equals(prod8))

Salt Okunur Değerler

Anahtar özelliklerin değerleri değiştirilemez. Örneğin, prod8 önceki örnekte Name ve Price alanları şeklindedir read-onlyancak OnHand değiştirilebilir.

' The following statement will not compile, because Name is a key
' property and its value cannot be changed.
' prod8.Name = "clamps"

' OnHand is not a Key property. Its value can be changed.
prod8.OnHand = 22

Sorgu İfadelerinden Anonim Türler

Sorgu ifadeleri her zaman anonim türlerin oluşturulmasını gerektirmez. Mümkün olduğunda, sütun verilerini tutmak için var olan bir türü kullanırlar. Bu durum, sorgu veri kaynağındaki kayıtların tamamını veya her kayıttan yalnızca bir alanı döndürdüğünde oluşur. Aşağıdaki kod örneklerinde, customers bir Customer sınıfın nesneleri koleksiyonudur. sınıfının birçok özelliği vardır ve sorgu sonucuna herhangi bir sırada bunlardan birini veya daha fazlasını ekleyebilirsiniz. İlk iki örnekte, sorgular adlandırılmış türlerin öğelerini seçtiğinden anonim tür gerekmez:

  • custs1 dize olduğundan bir cust.Name dize koleksiyonu içerir.

    Dim custs1 = From cust In customers
                 Select cust.Name
    
  • custs2her öğesi customers bir nesne olduğundan ve öğesinin Customer tamamı sorgu tarafından seçildiğinden bir Customer nesne koleksiyonu içerir.

    Dim custs2 = From cust In customers
                 Select cust
    

Ancak, uygun adlandırılmış türler her zaman kullanılamaz. Bir amaç için müşteri adlarını ve adreslerini, başka bir amaç için müşteri kimlik numaralarını ve konumlarını, üçüncü bir amaç için de müşteri adlarını, adreslerini ve sipariş geçmişlerini seçmek isteyebilirsiniz. Anonim türler, sonucu tutmak için ilk olarak yeni bir adlandırılmış tür bildirmeden herhangi bir sırayla özelliklerin herhangi bir bileşimini seçmenizi sağlar. Bunun yerine, derleyici özelliklerin her derlemesi için anonim bir tür oluşturur. Aşağıdaki sorgu, içindeki customersher Customer nesneden yalnızca müşterinin adını ve kimlik numarasını seçer. Bu nedenle, derleyici yalnızca bu iki özelliği içeren anonim bir tür oluşturur.

Dim custs3 = From cust In customers
             Select cust.Name, cust.ID

Anonim türdeki özelliklerin hem adları hem de veri türleri, cust.Name ve cust.IDbağımsız değişkenlerinden Selectalınır. Bir sorgu tarafından oluşturulan anonim bir türdeki özellikler her zaman önemli özelliklerdir. Aşağıdaki For Each döngüde yürütürkencusts3, sonuç iki anahtar özelliğine Name sahip anonim bir türün örneklerinin koleksiyonudur ve .ID

For Each selectedCust In custs3
    Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name)
Next

tarafından custs3 temsil edilen koleksiyondaki öğeler kesin olarak yazılır ve kullanılabilir özelliklerde gezinmek ve türlerini doğrulamak için IntelliSense'i kullanabilirsiniz.

Daha fazla bilgi için bkz . Visual Basic'te LINQ'e giriş.

Anonim Türlerin Kullanılıp Kullanılmaymayacağına Karar Verme

Anonim bir sınıfın örneği olarak bir nesne oluşturmadan önce bunun en iyi seçenek olup olmadığını göz önünde bulundurun. Örneğin, ilgili verileri içerecek geçici bir nesne oluşturmak istiyorsanız ve tam bir sınıfın içerebileceği diğer alanlara ve yöntemlere ihtiyacınız yoksa, anonim tür iyi bir çözümdür. Her bildirim için farklı bir özellik seçimi istiyorsanız veya özelliklerin sırasını değiştirmek istiyorsanız anonim türler de kullanışlıdır. Ancak, projeniz aynı özelliklere sahip birkaç nesne içeriyorsa, sabit bir sırayla, sınıf oluşturucu ile adlandırılmış bir tür kullanarak bunları daha kolay bildirebilirsiniz. Örneğin, uygun bir oluşturucu ile, bir sınıfın birkaç örneğini bildirmek, anonim bir türün Product birkaç örneğini bildirmekten daha kolaydır.

' Declaring instances of a named type.
Dim firstProd1 As New Product("paperclips", 1.29)
Dim secondProd1 As New Product("desklamp", 28.99)
Dim thirdProd1 As New Product("stapler", 5.09)

' Declaring instances of an anonymous type.
Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99}
Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}

Adlandırılmış türlerin bir diğer avantajı, derleyicinin bir özellik adının yanlışlıkla yanlış şekillendirildiğini yakalayabilmesidir. Önceki örneklerde, firstProd2, secondProd2ve thirdProd2 aynı anonim türdeki örnekler olarak tasarlanmıştır. Ancak, aşağıdaki yollardan biriyle yanlışlıkla bildireceksenizthirdProd2, türü ve secondProd2türünden firstProd2 farklı olabilir.

' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}
' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"}
' Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}

Daha da önemlisi, adlandırılmış türlerin örnekleri için geçerli olmayan anonim türlerin kullanımıyla ilgili sınırlamalar vardır. firstProd2, secondProd2ve thirdProd2 aynı anonim türdeki örneklerdir. Ancak, paylaşılan anonim türün adı kullanılamaz ve kodunuzda tür adının beklendiği yerde görünemez. Örneğin, anonim bir tür yöntem imzası tanımlamak, başka bir değişken veya alan bildirmek ya da herhangi bir tür bildiriminde kullanılamaz. Sonuç olarak, yöntemler arasında bilgi paylaşmanız gerektiğinde anonim türler uygun değildir.

Anonim Tür Tanımı

Anonim bir türün örneğinin bildirimine yanıt olarak, derleyici belirtilen özellikleri içeren yeni bir sınıf tanımı oluşturur.

Anonim tür en az bir anahtar özelliği içeriyorsa, tanım : Equals, GetHashCodeve ToStringöğesinden devralınan üç üyeyi Objectgeçersiz kılar. Eşitliği sınamak ve karma kod değerini belirlemek için üretilen kod yalnızca temel özellikleri dikkate alır. Anonim tür hiçbir anahtar özelliği içermiyorsa, yalnızca ToString geçersiz kılınmış olur. Anonim bir türün açıkça adlandırılmış özellikleri, oluşturulan bu yöntemlerle çakışamaz. Yani, bir özelliği adlandırmak için , .GetHashCodeveya .ToString kullanamazsınız.Equals.

En az bir anahtar özelliğine sahip anonim tür tanımları da arabirimi uygular System.IEquatable<T> ; burada T anonim türün türüdür.

Derleyici tarafından oluşturulan kod ve geçersiz kılınan yöntemlerin işlevselliği hakkında daha fazla bilgi için bkz . Anonim Tür Tanımı.

Ayrıca bkz.