Nesne Başlatıcıları: Adlandırılmış ve Anonim Türler (Visual Basic)

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.

Bildirimler

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. için namedCust, özelliği olan bir CustomerName sınıfın zaten mevcut olması gerekir ve bildirimi bu sınıfın bir örneğini oluşturur. için anonymousCust, derleyici bir özelliği olan yeni bir sınıf tanımlar, adlı Namebir dize 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, sınıfın Customer mevcut olması ve adlı Name ve City dize değerlerini kabul edebilen üyeleri olmalı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 deyimini With kullanarak ve City özellikleri için Name ilk değerleri belirten aşağıdaki örnekle eşdeğerdir.

Dim cust2 As New Customer()
With cust2
    .Name = "Toni Poe"
    .City = "Louisville"
End With

Customer sınıfı için bir değer Namegöndermenizi sağlayan parametreli bir oluşturucu içeriyorsa, örneğin, aşağıdaki yollarla bir Customer nesnesi de 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ı ve yerel tür çıkarımı birleştirerek bildiriminin cust1 kodunu kısaltabilirsiniz. Bu, değişken bildirimindeki yan tümcesini As 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. bildirimi bir hataya cust7 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, için aşağıdaki bildirimde cust8olduğu gibi başlatılmadan önce erişilirse, varsayılan 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 örneklerde için varsayılan değeri Name atanır cust8ve içinde cust9baş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, ve'den cust3cust4 parametreli oluşturucuyu kullanarak ve cust11'yi bildirir ve başlatırcust10.

    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, AddressClass ve olmak üzere iki özelliği CityStateolan bir sınıf ve Customer sınıfının örneği AddressClassolan bir Address özelliği 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 dizine alınamaz veya nitelenemez. 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 için cust6ö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 dize olacak ve City türlerini Name 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ü kullanmamalı veya adını kullanmamalıdır.

Türün adı kullanılamadığından, bildirmek cust13için bir As yan tümce 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 bkz . 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.

Ayrıca bkz.