Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Nesne başlatıcılar, tek bir ifade kullanarak karmaşık bir nesnenin özelliklerini belirtmenizi sağlar. Adlandırılmış türlerin ve anonim türlerin örneklerini oluşturmak için kullanılabilirler.
Bildirim
Adlandırılmış ve anonim türlerin örneklerinin bildirimleri neredeyse aynı görünebilir, ancak etkileri aynı değildir. Her kategorinin kendi yetenekleri ve kısıtlamaları vardır. Aşağıdaki örnekte, Customerbir nesne başlatıcı listesi kullanarak adlandırılmış bir sınıfın örneğini bildirmenin ve başlatmanın kullanışlı bir yolu gösterilmektedir. sınıfının adının anahtar sözcüğünden Newsonra belirtildiğine dikkat edin.
Dim namedCust = New Customer With {.Name = "Terry Adams"}
Anonim bir türün kullanılabilir adı yoktur. Bu nedenle, anonim bir türün örneklemesi sınıf adı içeremez.
Dim anonymousCust = New With {.Name = "Hugo Garcia"}
İki bildirimin gereksinimleri ve sonuçları aynı değildir.
namedCust için, Customer özelliği olan bir Name sınıfının zaten mevcut olması gerekir ve bildirim, bu sınıfın bir örneğini oluşturur.
anonymousCust için, derleyici Name adında bir dize özelliğine sahip yeni bir sınıf tanımlar ve bu sınıfın yeni bir örneğini oluşturur.
Adlandırılmış Türler
Nesne başlatıcılar, bir türün oluşturucusunu çağırmak ve ardından tek bir deyimde bazı veya tüm özelliklerin değerlerini ayarlamak için basit bir yol sağlar. Derleyici deyimi için uygun oluşturucuyu çağırır: bağımsız değişken sunulmazsa parametresiz oluşturucu veya bir veya daha fazla bağımsız değişken gönderilirse parametreli bir oluşturucu. Bundan sonra, belirtilen özellikler başlatıcı listesinde sunuldukları sırayla başlatılır.
Başlatıcı listesindeki her başlatma, sınıfın bir üyesine bir ilk değerin atanma işleminden oluşur. Üyelerin adları ve veri türleri, sınıf tanımlandığında belirlenir. Aşağıdaki örneklerde, Customer sınıfı mevcut olmalı ve bu sınıfın Name ve City adında, dize değerlerini kabul edebilen üyeleri bulunmalıdır.
Dim cust0 As Customer = New Customer With {.Name = "Toni Poe",
.City = "Louisville"}
Alternatif olarak, aşağıdaki kodu kullanarak da aynı sonucu elde edebilirsiniz:
Dim cust1 As New Customer With {.Name = "Toni Poe",
.City = "Louisville"}
Bu bildirimlerin her biri, parametresiz oluşturucuyu kullanarak bir Customer nesne oluşturan ve ardından Name ve City özellikleri için With deyimini kullanarak ilk değerleri belirleyen aşağıdaki örnekle eşdeğerdir.
Dim cust2 As New Customer()
With cust2
.Name = "Toni Poe"
.City = "Louisville"
End With
Örneğin, Customer sınıfı parametreli bir oluşturucu içeriyorsa ve bu oluşturucu bir Name değerini göndermenizi sağlıyorsa, bir Customer nesnesini aşağıdaki şekillerde bildirebilir ve başlatabilirsiniz:
Dim cust3 As Customer =
New Customer("Toni Poe") With {.City = "Louisville"}
' --or--
Dim cust4 As New Customer("Toni Poe") With {.City = "Louisville"}
Aşağıdaki kodda gösterildiği gibi tüm özellikleri başlatmanız gerekmez.
Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}
Ancak, başlatma listesi boş olamaz. Başlatılmamış özellikler varsayılan değerlerini korur.
Adlandırılmış Türlerle Tür Çıkarımı
Nesne başlatıcılarını ve yerel tür çıkarmayı birleştirerek cust1 bildirimi için kodu kısaltabilirsiniz. Bu, değişken bildirimindeki As ifadesini atlamanızı sağlar. Değişkenin veri türü, atama tarafından oluşturulan nesnenin türünden çıkarılır. Aşağıdaki örnekte, türü cust6 şeklindedir Customer.
Dim cust6 = New Customer With {.Name = "Toni Poe",
.City = "Louisville"}
Adlandırılmış Türler Hakkında Açıklamalar
Bir sınıf üyesi, nesne başlatıcı listesinde birden fazla kez başlatılamaz.
cust7bildirimi bir hataya neden olur.'' This code does not compile because Name is initialized twice. ' Dim cust7 = New Customer With {.Name = "Toni Poe", ' .City = "Louisville", ' .Name = "Blue Yonder Airlines"}Bir üye kendisini veya başka bir alanı başlatmak için kullanılabilir. Bir üyeye, aşağıdaki
cust8bildirimi gibi başlatılmadan önce erişilirse, ön tanımlı değer kullanılır. Nesne başlatıcı kullanan bir bildirim işlendiğinde ilk olarak uygun oluşturucunun çağrıldığını unutmayın. Bundan sonra, başlatıcı listesindeki tek tek alanlar başlatılır. Aşağıdaki örneklerdeNameiçin varsayılan değercust8vecust9içinde başlatılan bir değer atanır.Dim cust8 = New Customer With {.Name = .Name & ", President"} Dim cust9 = New Customer With {.Name = "Toni Poe", .Title = .Name & ", President"}Aşağıdaki örnek,
cust3vecust4'den parametreli oluşturucuyu kullanarakcust10vecust11'yi bildirir ve başlatır.Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"} ' --or-- Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}Nesne başlatıcılar iç içe yerleştirilmiş olabilir. Aşağıdaki örnekte,
AddressClassveCityolmak üzere iki özelliğe sahip birStatesınıfı veCustomerörneği olan birAddressözelliğine sahipAddressClasssınıfı vardır.Dim cust12 = New Customer With {.Name = "Toni Poe", .Address = New AddressClass With {.City = "Louisville", .State = "Kentucky"}} Console.WriteLine(cust12.Address.State)Başlatma listesi boş olamaz.
Başlatılan örnek Object türünde olamaz.
Başlatılan sınıf üyeleri paylaşılan üyeler, salt okunur üyeler, sabitler veya yöntem çağrıları olamaz.
Başlatılmakta olan sınıf üyeleri indekslenemez veya nitelendirilemez. Aşağıdaki örnekler derleyici hatalarını tetikler:
'' Not valid.' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}' Dim c2 = New Customer with {.Address.City = "Springfield"}
Anonim Türler
Anonim türler, açıkça tanımlamadığınız ve adlandırmadığınız yeni türlerin örneklerini oluşturmak için nesne başlatıcıları kullanır. Bunun yerine, derleyici nesne başlatıcı listesinde belirlediğiniz özelliklere göre bir tür oluşturur. Türün adı belirtilmediğinden anonim tür olarak adlandırılır. Örneğin, aşağıdaki bildirimi, cust6 için önceki bildirimle karşılaştırın.
Dim cust13 = New With {.Name = "Toni Poe",
.City = "Louisville"}
Söz dizimsel olarak tek fark, veri türü için sonra New hiçbir ad belirtilmemiş olmasıdır. Ancak, olanlar oldukça farklıdır. Derleyici, Name ve Cityolmak üzere iki özelliği olan yeni bir anonim tür tanımlar ve belirtilen değerlerle bunun bir örneğini oluşturur. Tür çıkarımı, örnekte Name ve City türlerini dize olarak belirler.
Dikkat
Anonim türün adı derleyici tarafından oluşturulur ve derlemeden derlemeye farklılık gösterebilir. Kodunuz, anonim bir türün adını kullanmamalıdır.
Türün adı mevcut olmadığından, As bildirimi yapmak için bir cust13 yan cümlesi kullanamazsınız. Türü çıkarılmalıdır. Geç bağlama kullanmadan bu, anonim türlerin kullanımını yerel değişkenlerle sınırlar.
Anonim türler LINQ sorguları için kritik destek sağlar. Sorgularda anonim türlerin kullanımı hakkında daha fazla bilgi için bkz. Visual Basic'te Anonim Türler ve LINQ'e Giriş.
Anonim Türler Hakkında Açıklamalar
Genellikle, anonim tür bildirimindeki özelliklerin tümü veya çoğu, anahtar sözcüğü
Keyözellik adının önüne yazarak belirtilen anahtar özellikler olacaktır.Dim anonymousCust1 = New With {Key .Name = "Hugo Garcia", Key .City = "Louisville"}Anahtar özellikleri hakkında daha fazla bilgi için bakınız Anahtar.
Adlandırılmış türler gibi anonim tür tanımları için başlatıcı listeleri de en az bir özellik bildirmelidir.
Dim anonymousCust = New With {.Name = "Hugo Garcia"}Anonim türün bir örneği bildirildiğinde, derleyici eşleşen bir anonim tür tanımı oluşturur. Özelliklerin adları ve veri türleri örnek bildiriminden alınır ve derleyici tarafından tanıma eklenir. Adlandırılmış bir tür için olacağından özellikler önceden adlandırılmaz ve tanımlanmaz. Türleri çıkarılır. Bir yan tümcesi kullanarak
Asözelliklerin veri türlerini belirtemezsiniz.Anonim türler, özelliklerinin adlarını ve değerlerini farklı şekillerde de oluşturabilir. Örneğin, anonim tür özelliği bir değişkenin hem adını hem de değerini ya da başka bir nesnenin özelliğinin adını ve değerini alabilir.
' Create a variable, Name, and give it an initial value. Dim Name = "Hugo Garcia" ' Variable anonymousCust2 will have one property, Name, with ' "Hugo Garcia" as its initial value. Dim anonymousCust2 = New With {Key Name} ' The next declaration uses a property from namedCust, defined ' in an earlier example. After the declaration, anonymousCust3 will ' have one property, Name, with "Terry Adams" as its value. Dim anonymousCust3 = New With {Key namedCust.Name}Anonim türlerdeki özellikleri tanımlama seçenekleri hakkında daha fazla bilgi için bkz . Nasıl yapılır: Anonim Tür Bildirimlerinde Özellik Adlarını ve Türlerini Çıkarma.