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 Price
oluş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 Name
Price
sahip 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 Name
OnHand
sahip 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-only
ancak 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 bircust.Name
dize koleksiyonu içerir.Dim custs1 = From cust In customers Select cust.Name
custs2
her öğesicustomers
bir nesne olduğundan ve öğesininCustomer
tamamı sorgu tarafından seçildiğinden birCustomer
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 customers
her 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.ID
bağımsız değişkenlerinden Select
alı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
, secondProd2
ve thirdProd2
aynı anonim türdeki örnekler olarak tasarlanmıştır. Ancak, aşağıdaki yollardan biriyle yanlışlıkla bildireceksenizthirdProd2
, türü ve secondProd2
tü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
, secondProd2
ve 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 , .GetHashCode
veya .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ı.