Aracılığıyla paylaş


Visual Basic'te İfadeler

İfade, bir değerin hesaplamasını belirten veya bir değişken veya sabit belirleyen işleçler ve işlenenler dizisidir. Bu bölüm söz dizimini, işlenenlerin ve işleçlerin değerlendirilme sırasını ve ifadelerin anlamını tanımlar.

Expression
    : SimpleExpression
    | TypeExpression
    | MemberAccessExpression
    | DictionaryAccessExpression
    | InvocationExpression
    | IndexExpression
    | NewExpression
    | CastExpression
    | OperatorExpression
    | ConditionalExpression
    | LambdaExpression
    | QueryExpression
    | XMLLiteralExpression
    | XMLMemberAccessExpression
    ;

İfade Sınıflandırmaları

Her ifade aşağıdakilerden biri olarak sınıflandırılır:

  • Bir değer. Her değerin ilişkili bir türü vardır.

  • Bir değişken. Her değişken, değişkenin bildirilen türü olan ilişkili bir türe sahiptir.

  • Bir ad alanı. Bu sınıflandırmaya sahip bir ifade yalnızca üye erişiminin sol tarafı olarak görünebilir. Başka bir bağlamda, ad alanı olarak sınıflandırılan bir ifade derleme zamanı hatasına neden olur.

  • Bir tür. Bu sınıflandırmaya sahip bir ifade yalnızca üye erişiminin sol tarafı olarak görünebilir. Başka bir bağlamda, tür olarak sınıflandırılan bir ifade derleme zamanı hatasına neden olur.

  • Aynı ada aşırı yüklenmiş bir yöntem kümesi olan yöntem grubu. Yöntem grubu ilişkili bir hedef ifadeye ve ilişkili tür bağımsız değişken listesine sahip olabilir.

  • Bir yöntemin konumunu temsil eden bir yöntem işaretçisi. Yöntem işaretçisi ilişkili bir hedef ifadeye ve ilişkili tür bağımsız değişken listesine sahip olabilir.

  • Anonim bir yöntem olan lambda yöntemi.

  • Aynı ada aşırı yüklenmiş bir özellik kümesi olan özellik grubu. Özellik grubunun ilişkili bir hedef ifadesi olabilir.

  • Özellik erişimi. Her özellik erişimi, ilişkili bir türe sahiptir; bu da özelliğin türüdür. Özellik erişimi ilişkili bir hedef ifadeye sahip olabilir.

  • Çalışma zamanına kadar ertelenen bir yöntem veya özellik erişimini temsil eden geç bağlı erişim. Geç bağlanan erişim ilişkili bir hedef ifadeye ve ilişkili tür bağımsız değişken listesine sahip olabilir. Geç bağlanan erişimin türü her zaman Objectolur.

  • Etkinliğe erişim sağlama. Her etkinlik erişimi, etkinliğin kendi türüne ilişkilidir. Olay erişimi ilişkili bir hedef ifadeye sahip olabilir. Olay erişimi, , AddHandlerve RemoveHandler deyimlerinin RaiseEventilk bağımsız değişkeni olarak görünebilir. Başka bir bağlamda, olay erişimi olarak sınıflandırılan bir ifade derleme zamanı hatasına neden olur.

  • Türü henüz belirlenmemiş bir dizinin başlangıç değerlerini temsil eden bir dizi değişmez değeri.

  • Boşluk. Bu durum, ifade bir alt yordam çağrısı olduğunda veya sonuç içermeyen bir await işleci ifadesi olduğunda oluşur. Void olarak sınıflandırılan bir ifade yalnızca çağırma deyimi veya await deyimi bağlamında geçerlidir.

  • Varsayılan değer. Bu sınıflandırmayı yalnızca değişmez değer Nothing oluşturur.

İfadenin nihai sonucu genellikle bir değer veya değişkendir ve diğer ifade kategorileri yalnızca belirli bağlamlarda izin verilen ara değerler olarak çalışır.

Tür parametresine uygulanan kısıtlamalar bu özellikleri karşılarsa, türü tür parametresi olan ifadelerin belirli özelliklere (başvuru türü, değer türü, tür türetme vb.) sahip olmasını gerektiren deyimlerde ve ifadelerde kullanılabildiğini unutmayın.

İfadeYi Yeniden Sınıflandırma

Normalde, bir ifade, ifadenin sınıflandırmasından farklı bir sınıflandırma gerektiren bir bağlamda kullanıldığında, bir derleme zamanı hatası oluşur; örneğin, değişmez değere değer atama girişiminde bulunur. Ancak çoğu durumda, yeniden sınıflandırma işlemi aracılığıyla bir ifadenin sınıflandırmasını değiştirmek mümkündür.

Yeniden sınıflandırma başarılı olursa, yeniden sınıflandırma genişletme veya daraltma olarak değerlendirilir. Aksi belirtilmediği sürece, bu listedeki tüm yeniden sınıflandırmalar genişlemektedir.

Aşağıdaki ifade türleri yeniden sınıflandırılabilir:

  • Değişken bir değer olarak yeniden sınıflandırılabilir. değişkeninde depolanan değer getirilir.

  • Yöntem grubu bir değer olarak yeniden sınıflandırılabilir. Yöntem grubu ifadesi, ilişkili hedef ifade ve tür parametre listesi ile bir çağırma ifadesi olarak yorumlanır ve boş parantezler ( f olarak f() yorumlanır ve f(Of Integer) olarak f(Of Integer)()yorumlanır). Bu yeniden sınıflandırma, ifadenin daha fazla yeniden geçersiz olarak sınıflandırılmasıyla sonuçlanabilir.

  • Yöntem işaretçisi bir değer olarak yeniden sınıflandırılabilir. Bu yeniden sınıflandırma yalnızca hedef türün bilindiği bir dönüştürme bağlamında gerçekleşebilir. Yöntem işaretçisi ifadesi, ilişkili tür bağımsız değişkeni listesiyle uygun türde bir temsilci örnekleme ifadesinin bağımsız değişkeni olarak yorumlanır. Örneğin:

    Delegate Sub D(i As Integer)
    
    Module Test
        Sub F(i As Integer)
        End Sub
    
        Sub Main()
            Dim del As D
    
            ' The next two lines are equivalent.
            del = AddressOf F
            del = New D(AddressOf F)
        End Sub
    End Module
    
  • Lambda yöntemi bir değer olarak yeniden sınıflandırılabilir. Yeniden sınıflandırma, hedef türün bilindiği bir dönüştürme bağlamında gerçekleşirse, iki yeniden sınıflandırmadan biri oluşabilir:

    1. Hedef tür bir temsilci türüyse, lambda yöntemi uygun türde bir temsilci-yapı ifadesinin bağımsız değişkeni olarak yorumlanır.

    2. Hedef türü ise System.Linq.Expressions.Expression(Of T)ve T bir temsilci türüyse, lambda yöntemi için temsilci-oluşturma ifadesinde T kullanılıyormuş gibi yorumlanır ve ardından bir ifade ağacına dönüştürülür.

    Zaman uyumsuz veya yineleyici lambda yöntemi, temsilcinin ByRef parametresi yoksa, yalnızca bir temsilci-yapı ifadesinin bağımsız değişkeni olarak yorumlanabilir.

    Temsilcinin parametre türlerinden herhangi birinden ilgili lambda parametre türlerine dönüştürme bir daraltma dönüştürmesiyse, yeniden sınıflandırma daraltma olarak değerlendirilir; aksi takdirde genişler.

    Not. Lambda yöntemleri ve ifade ağaçları arasındaki tam çeviri derleyici sürümleri arasında sabit olmayabilir ve bu belirtim kapsamı dışındadır. Microsoft Visual Basic 11.0 için tüm lambda ifadeleri, aşağıdaki kısıtlamalara tabi olan ifade ağaçlarına dönüştürülebilir: (1) 1. Yalnızca ByRef parametresi olmayan tek satırlı lambda ifadeleri ifade ağaçlarına dönüştürülebilir. Tek satırlı Sub lambdaların yalnızca çağırma deyimleri ifade ağaçlarına dönüştürülebilir. (2) Sonraki bir alan başlatıcıyı başlatmak için daha önceki bir alan başlatıcı kullanılırsa anonim tür ifadeleri ifade ağaçlarına dönüştürülemez; örneğin. New With {.a=1, .b=.a} (3) Başlatılan geçerli nesnenin bir üyesi alan başlatıcılarından birinde kullanılıyorsa, nesne başlatıcı ifadeleri ifade ağaçlarına dönüştürülemez. Örneğin. New C1 With {.a=1, .b=.Method1()} (4) Çok boyutlu dizi oluşturma ifadeleri yalnızca öğe türlerini açıkça bildirmeleri durumunda ifade ağaçlarına dönüştürülebilir. (5) Geç bağlama ifadeleri ifade ağaçlarına dönüştürülemez. (6) Bir değişken veya alan Bir çağırma ifadesine ByRef geçirildiğinde ancak ByRef parametresiyle tam olarak aynı türe sahip olmadığında veya bir özellik ByRef'e geçirildiğinde normal VB semantiği, bağımsız değişkenin bir kopyasının ByRef'e geçirilip son değerinin değişkene veya alana veya özelliğe geri kopyalanmasıdır. İfade ağaçlarında, geri kopyalama gerçekleşmez. (7) Tüm bu kısıtlamalar iç içe lambda ifadeleri için de geçerlidir.

    Hedef türü bilinmiyorsa, lambda yöntemi, lambda yönteminin aynı imzasıyla anonim bir temsilci türünün temsilci örnekleme ifadesinin bağımsız değişkeni olarak yorumlanır. Katı semantikler kullanılıyorsa ve parametrelerden herhangi birinin türü atlanırsa, derleme zamanı hatası oluşur; aksi takdirde, Object eksik parametre türüyle değiştirilir. Örneğin:

    Module Test
        Sub Main()
            ' Type of x will be equivalent to Func(Of Object, Object, Object)
            Dim x = Function(a, b) a + b
    
            ' Type of y will be equivalent to Action(Of Object, Object)
            Dim y = Sub(a, b) Console.WriteLine(a + b)
        End Sub
    End Module
    
  • Özellik grubu, özellik erişimi olarak yeniden sınıflandırılabilir. Özellik grubu ifadesi boş parantez içeren bir dizin ifadesi olarak yorumlanır (yani olarak ff()yorumlanır).

  • Özellik erişimi bir değer olarak yeniden sınıflandırılabilir. Özellik erişim ifadesi, özelliğin erişimcisinin Get çağrı ifadesi olarak yorumlanır. Özelliğin alıcısı yoksa derleme zamanı hatası oluşur.

  • Geç bağlanan erişim, geç bağlanan bir yöntem veya geç bağlanan özellik erişimi olarak yeniden sınıflandırılabilir. Geç bağlanan erişimin hem yöntem erişimi hem de özellik erişimi olarak yeniden sınıflandırılabildiği bir durumda, özellik erişimine yeniden sınıflandırma tercih edilir.

  • Geç bağlanan erişim bir değer olarak yeniden sınıflandırılabilir.

  • Dizi değişmez değeri bir değer olarak yeniden sınıflandırılabilir. Değerin türü aşağıdaki gibi belirlenir:

    1. Yeniden sınıflandırma, hedef türün bilindiği ve hedef türün bir dizi türü olduğu bir dönüştürme bağlamında gerçekleşirse, dizi değişmez değeri T() türünde bir değer olarak yeniden sınıflandırılır. Hedef türü System.Collections.Generic.IList(Of T), , IReadOnlyList(Of T), ICollection(Of T)IReadOnlyCollection(Of T)veya IEnumerable(Of T)ise ve dizi değişmez değeri bir iç içe yerleştirme düzeyine sahipse, dizi değişmez değeri türünde T()bir değer olarak yeniden sınıflandırılır.

    2. Aksi takdirde, dizi değişmez değeri, türü iç içe yerleştirme düzeyine eşit bir derece dizisi olan bir değere yeniden sınıflandırılır ve öğe türü başlatıcıdaki öğelerin baskın türü tarafından belirlenir; baskın bir tür belirlenemiyorsa, Object kullanılır. Örneğin:

      ' x Is GetType(Double(,,))
      Dim x = { { { 1, 2.0 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }.GetType()
      
      ' y Is GetType(Integer())
      Dim y = { 1, 2, 3 }.GetType()
      
      ' z Is GetType(Object())
      Dim z = { 1, "2" }.GetType()
      
      ' Error: Inconsistent nesting
      Dim a = { { 10 }, { 20, 30 } }.GetType()
      

    Not. Dilin 9.0 sürümüyle 10.0 sürümü arasında küçük bir davranış değişikliği vardır. 10.0'ın öncesinde, dizi öğesi başlatıcıları yerel değişken türü çıkarımı etkilemezdi ve şimdi etkilemektedirler. Bu nedenleDim a() = { 1, 2, 3 }, dilin 9.0 sürümünde ve Integer() sürüm 10.0'da türü a olarak çıkarılırdıObject().

    Yeniden sınıflandırma daha sonra dizi değişmez değerini dizi oluşturma ifadesi olarak yeniden yorumlar. Bu nedenle örnekler:

    Dim x As Double = { 1, 2, 3, 4 }
    Dim y = { "a", "b" }
    

    şunlara eşdeğerdir:

    Dim x As Double = New Double() { 1, 2, 3, 4 }
    Dim y = New String() { "a", "b" }
    

    Bir öğe ifadesinden dizi öğesi türüne dönüştürme daraltılıyorsa, yeniden sınıflandırma daraltma olarak değerlendirilir; aksi takdirde genişleme olarak değerlendirilir.

  • Varsayılan değer bir değer Nothing olarak yeniden sınıflandırılabilir. Hedef türün bilindiği bağlamda, sonuç hedef türün varsayılan değeridir. Hedef türün bilinmediği bir bağlamda, sonuç türünde Objectbir null değerdir.

Ad alanı ifadesi, tür ifadesi, olay erişim ifadesi veya void ifadesi yeniden sınıflandırılamaz. Aynı anda birden çok yeniden sınıflandırma yapılabilir. Örneğin:

Module Test
    Sub F(i As Integer)
    End Sub

    ReadOnly Property P() As Integer
        Get
        End Get
    End Sub

    Sub Main()
        F(P)
    End Property
End Module

Bu durumda, özellik grubu ifadesi P önce bir özellik grubundan özellik erişimine yeniden sınıflandırılır ve ardından bir özellik erişiminden bir değere yeniden sınıflandırılır. Bağlamda geçerli bir sınıflandırmaya ulaşmak için en az sayıda yeniden sınıflandırma gerçekleştirilir.

Sabit İfadeler

Sabit ifade, değeri derleme zamanında tam olarak değerlendirilebilen bir ifadedir.

ConstantExpression
    : Expression
    ;

Sabit ifadenin türü , , , , , , , , Integer, SingleStringDoubleBooleanCharLongDateDecimalObjectULongveya herhangi bir numaralandırma türü olabilir.ByteUIntegerShortUShortSByte Sabit ifadelerde aşağıdaki yapılara izin verilir:

  • Değişmez değerler (dahil Nothing).

  • Sabit tür üyelerine veya sabit yerellere başvurular.

  • Numaralandırma türlerinin üyelerine atıflar.

  • Parantez içinde alt ifadeler.

  • Hedef türün yukarıda listelenen türlerden biri olması koşuluyla zorlama ifadeleri. Çalıştırma zamanında yürütme ortamının geçerli kültüründe dönüştürmeler her zaman yapıldığından, bu kurala gelen ve gelen String zorlamalar bu kuralın özel durumu olup yalnızca null değerlerde String izin verilir. Sabit zorlama ifadelerinin yalnızca iç dönüştürmeleri kullanabileceğini unutmayın.

  • İşlenen +ve Not sonucun yukarıda listelenen bir tür olması koşuluyla , - ve birli işleçleri.

  • +Her >*-^ModAnd&Or>>Xor<<=<=\/OrElse<AndAlso<>işlenen ve sonucun yukarıda listelenen bir tür olması koşuluyla , ve => ikili işleçleri.

  • Koşullu işleç If, sağlanan her işlenen ve sonuç yukarıda listelenen bir türdür.

  • Aşağıdaki çalışma zamanı işlevleri: Microsoft.VisualBasic.Strings.ChrW; Microsoft.VisualBasic.Strings.Chr sabit değer 0 ile 128 arasındaysa; Microsoft.VisualBasic.Strings.AscW sabit dize boş değilse; Microsoft.VisualBasic.Strings.Asc sabit dize boş değilse.

Sabit ifadelerde aşağıdaki yapılara izin verilmez :

  • Bağlam With aracılığıyla örtük bağlama.

Bir integral türünün (, , , , Integer, UShort, Short, SByteveya Byte) sabit ifadeleri örtük olarak daha dar bir tamsayı türüne dönüştürülebilir ve sabit ifadenin değeri hedef türün aralığı içinde olması koşuluyla türün Double sabit ifadeleri örtük olarak öğesine dönüştürülebilirSingle. UIntegerLongULong İzin verilen veya katı semantiğin kullanılıp kullanılmadığına bakılmaksızın bu daraltma dönüştürmelerine izin verilir.

Late-Bound İfadeleri

Bir üye erişim ifadesinin veya dizin ifadesinin hedefi türünde Objectolduğunda, ifadenin işlenmesi çalışma zamanına kadar ertelenebilir. Bu şekilde işlemeyi ertelemeye geç bağlama denir. Geç bağlama, değişkenlerin türüz bir şekilde kullanılmasını sağlarObject; burada üyelerin tüm çözümlemesi değişkendeki değerin gerçek çalışma zamanı türünü temel alır. Katı semantikler derleme ortamı veya tarafından Option Strictbelirtilirse, geç bağlama derleme zamanı hatasına neden olur. Aşırı yükleme çözümlemesi amacıyla da dahil olmak üzere geç bağlama yapılırken genel olmayan üyeler yoksayılır. Erken bağlı durumdan farklı olarak, bir Shared üyeyi geç bağlama çağırmanın veya bunlara erişmenin çağrı hedefinin çalışma zamanında değerlendirilmesine neden olacağını unutmayın. İfade, üzerinde System.Objecttanımlanan bir üye için bir çağırma ifadesiyse, geç bağlama gerçekleşmez.

Genel olarak, geç bağlanan erişimler, ifadenin gerçek çalışma zamanı türündeki tanımlayıcı aranarak çalışma zamanında çözümlenir. Geç bağlanan üye araması çalışma zamanında başarısız olursa bir System.MissingMemberException özel durum oluşur. Geç bağlanan üye araması yalnızca ilişkili hedef ifadenin çalışma zamanı türünden yapıldığından, nesnenin çalışma zamanı türü hiçbir zaman arabirim değildir. Bu nedenle, geç bağlanan üye erişim ifadesinde arabirim üyelerine erişmek mümkün değildir.

Geç bağlanan üye erişimine yönelik bağımsız değişkenler, parametrelerin geç bağlanan üyede bildirildiği sırada değil, üye erişim ifadesinde göründükleri sırayla değerlendirilir. Aşağıdaki örnekte bu fark gösterilmektedir:

Class C
    Public Sub f(ByVal x As Integer, ByVal y As Integer)
    End Sub
End Class

Module Module1
    Sub Main()
        Console.Write("Early-bound: ")
        Dim c As C = New C
        c.f(y:=t("y"), x:=t("x"))

        Console.Write(vbCrLf & "Late-bound: ")
        Dim o As Object = New C
        o.f(y:=t("y"), x:=t("x"))
    End Sub

    Function t(ByVal s As String) As Integer
        Console.Write(s)
        Return 0
    End Function
End Module

Bu kod şunu görüntüler:

Early-bound: xy
Late-bound: yx

Geç bağlanan aşırı yükleme çözümlemesi bağımsız değişkenlerin çalışma zamanı türünde yapıldığından, bir ifadenin derleme zamanında mı yoksa çalışma zamanında mı değerlendirildiğine bağlı olarak farklı sonuçlar üretmesi mümkündür. Aşağıdaki örnekte bu fark gösterilmektedir:

Class Base
End Class

Class Derived
    Inherits Base
End Class

Module Test
    Sub F(b As Base)
        Console.WriteLine("F(Base)")
    End Sub

    Sub F(d As Derived)
        Console.WriteLine("F(Derived)")
    End Sub

    Sub Main()
        Dim b As Base = New Derived()
        Dim o As Object = b

        F(b)
        F(o)
    End Sub
End Module

Bu kod şunu görüntüler:

F(Base)
F(Derived)

Basit İfadeler

Basit ifadeler değişmez değerler, parantezli ifadeler, örnek ifadeleri veya basit ad ifadeleridir.

SimpleExpression
    : LiteralExpression
    | ParenthesizedExpression
    | InstanceExpression
    | SimpleNameExpression
    | AddressOfExpression
    ;

Değişmez Değer İfadeleri

Değişmez değer ifadeleri, değişmez değerle temsil edilen değer olarak değerlendirilir. Değişmez değer ifadesi, varsayılan değer olarak sınıflandırılan değişmez Nothingdeğeri dışında değer olarak sınıflandırılır.

LiteralExpression
    : Literal
    ;

Parantezli İfadeler

Parantez içine alınmış ifade, parantez içine alınmış bir ifadeden oluşur. Parantez içine alınmış ifade bir değer olarak sınıflandırılır ve kapalı ifade değer olarak sınıflandırılmalıdır. Ayraçlı ifade, parantez içinde ifadenin değerini değerlendirir.

ParenthesizedExpression
    : OpenParenthesis Expression CloseParenthesis
    ;

Örnek İfadeleri

Örnek ifadesi anahtar sözcüğüdürMe. Yalnızca paylaşılmayan bir yöntem, oluşturucu veya özellik erişimcisinin gövdesinde kullanılabilir. Değer olarak sınıflandırılır. anahtar sözcüğü Me , yürütülmekte olan yöntemi veya özellik erişimcisini içeren türün örneğini temsil eder. Bir oluşturucu başka bir oluşturucuyu (Bölüm Oluşturucuları) açıkça çağırırsa, Me örnek henüz oluşturulamadığından, oluşturucu çağrısından sonraya kadar kullanılamaz.

InstanceExpression
    : 'Me'
    ;

Basit Ad İfadeleri

Basit ad ifadesi tek bir tanımlayıcıdan ve ardından isteğe bağlı tür bağımsız değişken listesinden oluşur.

SimpleNameExpression
    : Identifier ( OpenParenthesis 'Of' TypeArgumentList CloseParenthesis )?
    ;

Ad çözümlenir ve aşağıdaki "basit ad çözümleme kuralları" ile sınıflandırılır:

  1. Hemen kapsayan blokla başlayıp her dış bloğu kapsayan (varsa) ile devam eden tanımlayıcı, yerel değişken, statik değişken, sabit yerel, yöntem türü parametresi veya parametre adıyla eşleşiyorsa, tanımlayıcı eşleşen varlığa başvurur.

    Tanımlayıcı bir yerel değişken, statik değişken veya sabit yerel ile eşleşiyorsa ve bir tür bağımsız değişken listesi sağlandıysa, derleme zamanı hatası oluşur. Tanımlayıcı bir yöntem türü parametresiyle eşleşiyorsa ve tür bağımsız değişkeni listesi sağlandıysa, eşleşme gerçekleşmez ve çözümleme devam eder. Tanımlayıcı bir yerel değişkenle eşleşiyorsa, eşleştirilen yerel değişken örtük işlev veya Get erişimci dönüş yerel değişkenidir ve ifade bir çağırma ifadesinin, çağırma deyiminin veya bir ifadenin parçasıysa AddressOf , eşleşme gerçekleşmez ve çözümleme devam eder.

    İfade bir yerel değişken, statik değişken veya parametreyse değişken olarak sınıflandırılır. İfade, yöntem türü parametresiyse tür olarak sınıflandırılır. İfade, sabit bir yerel değer olarak sınıflandırılır.

  2. İfadeyi içeren iç içe her tür için, en içten başlayıp en dışa giden, türdeki tanımlayıcının bir araması erişilebilir bir üyeyle eşleşme oluşturursa:

    1. Eşleşen tür üyesi bir tür parametresiyse, sonuç tür olarak sınıflandırılır ve eşleşen tür parametresidir. Tür bağımsız değişken listesi sağlandıysa, eşleşme gerçekleşmez ve çözümleme devam eder.
    2. Aksi takdirde, tür hemen kapsayan türse ve arama paylaşılmayan bir tür üyesini tanımlarsa, sonuç formun Me.E(Of A)üye erişimiyle aynıdır; burada E tanımlayıcıdır ve A varsa tür bağımsız değişkeni listesidir.
    3. Aksi takdirde sonuç, formun T.E(Of A)üye erişimiyle tam olarak aynıdır; burada T eşleşen üyeyi E içeren tür tanımlayıcıdır ve A varsa tür bağımsız değişken listesidir. Bu durumda, tanımlayıcının paylaşılmayan üyeye başvurması bir hatadır.
  3. İç içe yerleştirilmiş her ad alanı için, en içten başlayıp en dıştaki ad alanına giderek aşağıdakileri yapın:

    1. Ad alanı, belirtilen ada sahip erişilebilir bir tür içeriyorsa ve tür bağımsız değişken listesinde sağlanan tür parametreleriyle aynı sayıda tür parametresine sahipse, varsa tanımlayıcı bu türe başvurur ve tür olarak sınıflandırılır.
    2. Aksi takdirde, hiçbir tür bağımsız değişken listesi sağlanmadıysa ve ad alanı verilen ada sahip bir ad alanı üyesi içeriyorsa, tanımlayıcı bu ad alanına başvurur ve ad alanı olarak sınıflandırılır.
    3. Aksi takdirde, ad alanı bir veya daha fazla erişilebilir standart modül içeriyorsa ve tanımlayıcının üye adı araması tam olarak bir standart modülde erişilebilir bir eşleşme oluşturuyorsa, sonuç formun M.E(Of A)üye erişimiyle tam olarak aynıdır; burada M eşleşen üyeyi içeren standart modül tanımlayıcıdır, E tanımlayıcıdır ve A tür bağımsız değişkeni listesidir, varsa. Tanımlayıcı, birden fazla standart modülde erişilebilir tür üyeleriyle eşleşiyorsa derleme zamanı hatası oluşur.
  4. Kaynak dosyada bir veya daha fazla içeri aktarma diğer adı varsa ve tanımlayıcı bunlardan birinin adıyla eşleşiyorsa, tanımlayıcı bu ad alanına veya türe başvurur. Tür bağımsız değişkeni listesi sağlanırsa, derleme zamanı hatası oluşur.

  5. Ad başvuruyu içeren kaynak dosyada bir veya daha fazla içeri aktarma varsa:

    1. Tanımlayıcı, tür bağımsız değişkeni listesinde sağlanan tür parametreleriyle (varsa) veya tür üyesiyle aynı sayıda tür parametresine sahip erişilebilir bir türün adını tam olarak bir içeri aktarıyorsa, tanımlayıcı bu türe veya tür üyesine başvurur. Tanımlayıcı birden fazla türde eşleşiyorsa, tür bağımsız değişken listesinde sağlanan tür parametreleriyle aynı sayıda tür parametresine sahip bir erişilebilir türün adını içeri aktarıyorsa ,varsa veya erişilebilir bir tür üyesiyse, derleme zamanı hatası oluşur.
    2. Aksi takdirde, hiçbir tür bağımsız değişken listesi sağlanmadıysa ve tanımlayıcı, erişilebilir türlere sahip bir ad alanının adını tam olarak bir içeri aktarmada eşleşiyorsa, tanımlayıcı bu ad alanına başvurur. Hiçbir tür bağımsız değişken listesi sağlanmadıysa ve tanımlayıcı, erişilebilir türlerdeki bir ad alanının adını birden fazla içeri aktarma işleminde eşleşiyorsa, derleme zamanı hatası oluşur.
    3. Aksi takdirde, içeri aktarmalar bir veya daha fazla erişilebilir standart modül içeriyorsa ve tanımlayıcının üye adı araması tam olarak bir standart modülde erişilebilir bir eşleşme oluşturuyorsa, sonuç formun M.E(Of A)üye erişimiyle tam olarak aynıdır; burada M eşleşen üyeyi içeren standart modül tanımlayıcıdır, E tanımlayıcıdır ve A tür bağımsız değişkeni listesidir, varsa. Tanımlayıcı, birden fazla standart modülde erişilebilir tür üyeleriyle eşleşiyorsa derleme zamanı hatası oluşur.
  6. Derleme ortamı bir veya daha fazla içeri aktarma diğer adını tanımlıyorsa ve tanımlayıcı bunlardan birinin adıyla eşleşiyorsa, tanımlayıcı bu ad alanına veya türe başvurur. Tür bağımsız değişkeni listesi sağlanırsa, derleme zamanı hatası oluşur.

  7. Derleme ortamı bir veya daha fazla içeri aktarma tanımlıyorsa:

    1. Tanımlayıcı, tür bağımsız değişkeni listesinde sağlanan tür parametreleriyle (varsa) veya tür üyesiyle aynı sayıda tür parametresine sahip erişilebilir bir türün adını tam olarak bir içeri aktarıyorsa, tanımlayıcı bu türe veya tür üyesine başvurur. Tanımlayıcı birden fazla türde eşleşiyorsa, tür bağımsız değişken listesinde sağlanan tür parametreleriyle aynı sayıda tür parametresine sahip bir erişilebilir türün adını içeri aktarıyorsa ,varsa veya bir tür üyesiyse, derleme zamanı hatası oluşur.
    2. Aksi takdirde, hiçbir tür bağımsız değişken listesi sağlanmadıysa ve tanımlayıcı, erişilebilir türlere sahip bir ad alanının adını tam olarak bir içeri aktarmada eşleşiyorsa, tanımlayıcı bu ad alanına başvurur. Hiçbir tür bağımsız değişken listesi sağlanmadıysa ve tanımlayıcı, erişilebilir türlerdeki bir ad alanının adını birden fazla içeri aktarma işleminde eşleşiyorsa, derleme zamanı hatası oluşur.
    3. Aksi takdirde, içeri aktarmalar bir veya daha fazla erişilebilir standart modül içeriyorsa ve tanımlayıcının üye adı araması tam olarak bir standart modülde erişilebilir bir eşleşme oluşturuyorsa, sonuç formun M.E(Of A)üye erişimiyle tam olarak aynıdır; burada M eşleşen üyeyi içeren standart modül tanımlayıcıdır, E tanımlayıcıdır ve A tür bağımsız değişkeni listesidir, varsa. Tanımlayıcı, birden fazla standart modülde erişilebilir tür üyeleriyle eşleşiyorsa derleme zamanı hatası oluşur.
  8. Aksi takdirde, tanımlayıcı tarafından verilen ad tanımlanmamıştır.

Tanımsız basit bir ad ifadesi derleme zamanı hatasıdır.

Normalde, bir ad belirli bir ad alanında yalnızca bir kez oluşabilir. Ancak, ad alanları birden çok .NET derlemesi arasında bildirilebildiği için, iki derlemenin aynı tam ada sahip bir tür tanımladığı bir duruma sahip olmak mümkündür. Bu durumda, geçerli kaynak dosya kümesinde bildirilen bir tür, dış .NET derlemesinde bildirilen bir türe göre tercih edilir. Aksi takdirde, ad belirsizdir ve adı kesinleştirmenin bir yolu yoktur.

AddressOf İfadeleri

İfade AddressOf , yöntem işaretçisi oluşturmak için kullanılır. İfade, anahtar sözcüğünden AddressOf ve yöntem grubu veya geç bağlanan erişim olarak sınıflandırılması gereken bir ifadeden oluşur. Yöntem grubu oluşturuculara başvuramaz.

Sonuç, yöntem grubuyla aynı ilişkili hedef ifade ve tür bağımsız değişken listesi (varsa) ile bir yöntem işaretçisi olarak sınıflandırılır.

AddressOfExpression
    : 'AddressOf' Expression
    ;

Tür İfadeleri

Tür ifadesi bir GetType ifade, ifadeTypeOf...Is, ifade Is veya GetXmlNamespace ifadedir.

TypeExpression
    : GetTypeExpression
    | TypeOfIsExpression
    | IsExpression
    | GetXmlNamespaceExpression
    ;

GetType İfadeleri

İfade GetType anahtar sözcüğünden GetType ve bir türün adından oluşur.

GetTypeExpression
    : 'GetType' OpenParenthesis GetTypeTypeName CloseParenthesis
    ;

GetTypeTypeName
    : TypeName
    | QualifiedOpenTypeName
    ;

QualifiedOpenTypeName
    : Identifier TypeArityList? (Period IdentifierOrKeyword TypeArityList?)*
    | 'Global' Period IdentifierOrKeyword TypeArityList?
      (Period IdentifierOrKeyword TypeArityList?)*
    ;

TypeArityList
    : OpenParenthesis 'Of' CommaList? CloseParenthesis
    ;

CommaList
    : Comma Comma*
    ;

İfade GetType bir değer olarak sınıflandırılır ve değeri GetTypeTypeName değerini temsil eden yansıma (System.Type) sınıfıdır. GetTypeTypeName bir tür parametresiyse, ifade çalışma zamanında tür parametresi için sağlanan tür bağımsız değişkenine karşılık gelen nesneyi döndürürSystem.Type.

GetTypeTypeName iki şekilde özeldir:

  • Bu tür adına başvurulabilecek System.Voiddilde tek yer olarak kullanılmasına izin verilir.

  • Tür bağımsız değişkenleri atlanmış bir genel tür olabilir. Bu, ifadenin GetType genel türün System.Type kendisine karşılık gelen nesneyi döndürmesine olanak tanır.

Aşağıdaki örnekte ifade gösterilmektedir GetType :

Module Test
    Sub Main()
        Dim t As Type() = { GetType(Integer), GetType(System.Int32), _
            GetType(String), GetType(Double()) }
        Dim i As Integer

        For i = 0 To t.Length - 1
            Console.WriteLine(t(i).Name)
        Next i
    End Sub
End Module

Sonuçta elde edilen çıktı:

Int32
Int32
String
Double[]

TypeOf... İfadeler

İfade TypeOf...Is , bir değerin çalışma zamanı türünün belirli bir türle uyumlu olup olmadığını denetlemek için kullanılır. İlk işlenen bir değer olarak sınıflandırılmalı, yeniden sınıflandırılmış bir lambda yöntemi olamaz ve bir başvuru türünde veya kısıtlanmamış türde bir parametre türünde olmalıdır. İkinci işlenen bir tür adı olmalıdır. İfadenin sonucu değer olarak sınıflandırılır ve bir Boolean değerdir. İfade, işlenenin çalışma zamanı türünün kimliğe, varsayılana, başvuruya, diziye True , değer türüne veya tür parametre dönüştürmesine sahip olup olmadığını değerlendirir, False aksi takdirde. İfadenin türü ile belirli bir tür arasında dönüştürme yoksa derleme zamanı hatası oluşur.

TypeOfIsExpression
    : 'TypeOf' Expression 'Is' LineTerminator? TypeName
    ;

İfadeler

Bir Is veya IsNot ifadesi, başvuru eşitliği karşılaştırması yapmak için kullanılır.

IsExpression
    : Expression 'Is' LineTerminator? Expression
    | Expression 'IsNot' LineTerminator? Expression
    ;

Her ifade bir değer olarak sınıflandırılmalı ve her ifadenin türü bir başvuru türü, kısıtlanmamış tür parametre türü veya null atanabilir bir değer türü olmalıdır. Ancak, bir ifadenin türü kısıtlanmamış bir tür parametre türü veya null atanabilir değer türüyse, diğer ifade değişmez değer Nothingolmalıdır.

Sonuç bir değer olarak sınıflandırılır ve olarak Booleanyazılır. her Is iki değer de aynı örneğe başvuruda bulunursa veya her iki değer Nothingde ise veya False başka bir şekilde değerlendirilirTrue. her IsNot iki değer de aynı örneğe başvuruda bulunursa veya her iki değer Nothingde ise veya True başka bir şekilde değerlendirilirFalse.

GetXmlNamespace İfadeleri

İfade GetXmlNamespace , anahtar sözcüğünden GetXmlNamespace ve kaynak dosya veya derleme ortamı tarafından bildirilen XML ad alanının adından oluşur.

GetXmlNamespaceExpression
    : 'GetXmlNamespace' OpenParenthesis XMLNamespaceName? CloseParenthesis
    ;

İfade GetXmlNamespace bir değer olarak sınıflandırılır ve değeri XMLNamespaceName değerini temsil eden bir örneğidirSystem.Xml.Linq.XNamespace. Bu tür kullanılamıyorsa derleme zamanı hatası oluşur.

Örneğin:

Imports <xmlns:db="http://example.org/database">

Module Test
    Sub Main()
        Dim db = GetXmlNamespace(db)

        ' The following are equivalent
        Dim customer1 = _
            New System.Xml.Linq.XElement(db + "customer", "Bob")
        Dim customer2 = <db:customer>Bob</>
    End Sub
End Module

Parantezler arasındaki her şey ad alanı adının bir parçası olarak kabul edilir, bu nedenle boşluk gibi öğelerin etrafındaki XML kuralları uygulanır. Örneğin:

Imports <xmlns:db-ns="http://example.org/database">

Module Test
    Sub Main()

        ' Error, XML name expected
        Dim db1 = GetXmlNamespace( db-ns )

        ' Error, ')' expected
        Dim db2 = GetXmlNamespace(db _
            )

        ' OK.
        Dim db3 = GetXmlNamespace(db-ns)
    End Sub
End Module

XML ad alanı ifadesi de atlanabilir, bu durumda ifade varsayılan XML ad alanını temsil eden nesneyi döndürür.

Üye Erişim İfadeleri

Bir varlığın üyesine erişmek için üye erişim ifadesi kullanılır.

MemberAccessExpression
    : MemberAccessBase? Period IdentifierOrKeyword
      ( OpenParenthesis 'Of' TypeArgumentList CloseParenthesis )?
    ;

MemberAccessBase
    : Expression
    | NonArrayTypeName
    | 'Global'
    | 'MyClass'
    | 'MyBase'
    ;

bir ifade, dizi olmayan tür adı, anahtar sözcük Globalveya atlanan ve I isteğe bağlı tür bağımsız değişken listesi Aolan bir tanımlayıcı olan formunun E.I(Of A)E üye erişimi değerlendirilir ve aşağıdaki gibi sınıflandırılır:

  1. Atlanırsa E , hemen içeren With deyiminden E ifade yerine kullanılır ve üye erişimi gerçekleştirilir. İçeren With bir deyim yoksa derleme zamanı hatası oluşur.

  2. E Ad alanı olarak sınıflandırıldıysa veya E anahtar sözcüğü Globalise, üye araması belirtilen ad alanı bağlamında yapılır. Varsa I , tür bağımsız değişken listesinde sağlanan tür parametreleriyle aynı sayıda tür parametresine sahip bu ad alanının erişilebilir bir üyesinin adıysa, sonuç o üyedir. Sonuç, üyeye bağlı olarak ad alanı veya tür olarak sınıflandırılır. Aksi takdirde derleme zamanı hatası oluşur.

  3. Tür veya tür olarak sınıflandırılan bir ifadeyse E , üye araması belirtilen tür bağlamında yapılır. erişilebilir üyesinin EE.I adı iseI, aşağıdaki gibi değerlendirilir ve sınıflandırılır:

    1. Anahtar sözcükse INew ve E bir numaralandırma değilse derleme zamanı hatası oluşur.
    2. Tür bağımsız değişkeni listesinde sağlanan tür parametreleriyle aynı sayıda tür parametresine sahip bir tür tanımlarsa I , varsa sonuç bu tür olur.
    3. Bir veya daha fazla yöntem tanımlarsa I , sonuç ilişkili tür bağımsız değişken listesi olan ve ilişkili hedef ifade içermeyen bir yöntem grubudur.
    4. Bir veya daha fazla özellik tanımlarsa ve hiçbir tür bağımsız değişken listesi sağlanmadıysa I , sonuç ilişkili hedef ifadesi olmayan bir özellik grubudur.
    5. Paylaşılan bir değişken tanımlarsa ve hiçbir tür bağımsız değişken listesi sağlanmadıysa I , sonuç bir değişken veya değerdir. Değişken salt okunursa ve başvuru, değişkenin bildirildiği türün paylaşılan oluşturucusunun dışında gerçekleşirse, sonuç içindeki Epaylaşılan değişkenin I değeridir. Aksi takdirde, sonuç içindeki Epaylaşılan değişkendirI.
    6. Paylaşılan bir olayı tanımlarsa ve hiçbir tür bağımsız değişken listesi sağlanmadıysa I , sonuç ilişkili hedef ifadesi olmayan bir olay erişimidir.
    7. Bir sabit tanımlarsa ve hiçbir tür bağımsız değişken listesi sağlanmadıysa I , sonuç bu sabitin değeridir.
    8. Bir numaralandırma üyesi tanımlarsa ve hiçbir tür bağımsız değişken listesi sağlanmadıysa I , sonuç bu numaralandırma üyesinin değeridir.
    9. Aksi takdirde, E.I geçersiz bir üye başvurusudur ve derleme zamanı hatası oluşur.
  4. türü olan bir değişken veya değer Tolarak sınıflandırılırsaE, üye araması bağlamında Tyapılır. erişilebilir üyesinin TE.I adı iseI, aşağıdaki gibi değerlendirilir ve sınıflandırılır:

    1. anahtar sözcüğü Newise , MeMyBaseE veya MyClassise ve hiçbir tür bağımsız değişkeni sağlanmadıysaI, sonuç türüne ait örnek oluşturucularını E ilişkili hedef ifadesiyle E temsil eden ve hiçbir tür bağımsız değişkeni listesi olmayan bir yöntem grubudur. Aksi takdirde derleme zamanı hatası oluşur.
    2. değilse uzantı yöntemleri ObjectT de dahil olmak üzere bir veya daha fazla yöntem tanımlarsa I sonuç, ilişkili tür bağımsız değişken listesi ve ilişkili hedef ifadesi Eolan bir yöntem grubudur.
    3. Bir veya daha fazla özellik tanımlarsa ve hiçbir tür bağımsız değişkeni sağlanmadıysa I , sonuç ilişkili hedef ifadesi Eolan bir özellik grubudur.
    4. Paylaşılan bir değişkeni veya örnek değişkenini tanımlarsa I ve hiçbir tür bağımsız değişkeni sağlanmadıysa, sonuç bir değişken veya değerdir. Değişken salt okunursa ve başvuru, değişkenin değişken türü (paylaşılan veya örnek) için uygun olarak bildirildiği sınıfın oluşturucusunun dışında gerçekleşirse, sonuç tarafından Ebaşvurulan nesnedeki değişkenin I değeridir. Bir başvuru türüyseT, sonuç tarafından Ebaşvuruda bulunan nesnedeki değişkendirI. Aksi takdirde, bir değer türüyse T ve ifade E değişken olarak sınıflandırılırsa, sonuç bir değişkendir; aksi takdirde sonuç bir değerdir.
    5. Bir olayı tanımlarsa ve hiçbir tür bağımsız değişkeni sağlanmadıysa I , sonuç ilişkili hedef ifadesi ile bir olay erişimidir E.
    6. Bir sabit tanımlarsa I ve hiçbir tür bağımsız değişkeni sağlanmadıysa, sonuç bu sabitin değeridir.
    7. Bir numaralandırma üyesi tanımlarsa ve hiçbir tür bağımsız değişkeni sağlanmadıysa I , sonuç bu numaralandırma üyesinin değeridir.
    8. ise TObject, sonuç ilişkili tür bağımsız değişken listesi ve ilişkili hedef ifadesi ile geç bağlı erişim olarak sınıflandırılan geç bağlı üye aramasıdır E.
  5. Aksi takdirde, E.I geçersiz bir üye başvurusudur ve derleme zamanı hatası oluşur.

Formun MyClass.I(Of A) üye erişimi ile Me.I(Of A)eşdeğerdir, ancak üzerinde erişilen tüm üyeler, üyeler geçersiz kılınamaz gibi kabul edilir. Bu nedenle, erişilen üye, üyeye erişilmekte olan değerin çalışma zamanı türünden etkilenmez.

Formun MyBase.I(Of A) üye erişimi, üye erişim ifadesini içeren türün doğrudan temel türü ile eşdeğerdir CType(Me, T).I(Of A)T . Üzerindeki tüm yöntem çağrıları, çağrılan yöntem geçersiz kılınamaz gibi değerlendirilir. Bu üye erişimi biçimine temel erişim de denir.

Aşağıdaki örnekte, MyBase ve MyClass arasındaki ilişki Megösterilmektedir:

Class Base
    Public Overridable Sub F()
        Console.WriteLine("Base.F")
    End Sub
End Class

Class Derived
    Inherits Base

    Public Overrides Sub F()
        Console.WriteLine("Derived.F")
    End Sub

    Public Sub G()
        MyClass.F()
    End Sub
End Class

Class MoreDerived
    Inherits Derived

    Public Overrides Sub F()
        Console.WriteLine("MoreDerived.F")
    End Sub

    Public Sub H()
        MyBase.F()
    End Sub
End Class

Module Test
    Sub Main()
        Dim x As MoreDerived = new MoreDerived()

        x.F()
        x.G()
        x.H()
    End Sub

End Module

Bu kod yazdırılır:

MoreDerived.F
Derived.F
Derived.F

Bir üye erişim ifadesi anahtar sözcüğüyle Globalbaşladığında anahtar sözcük, bir bildirimin kapsayan ad alanını gölgelediği durumlarda yararlı olan en dıştaki ad alanını temsil eder. anahtar sözcüğü, Global bu durumda en dıştaki ad alanına "kaçış" sağlar. Örneğin:

Class System
End Class

Module Test
    Sub Main()
        ' Error: Class System does not contain Console
        System.Console.WriteLine("Hello, world!") 


        ' Legal, binds to System in outermost namespace
        Global.System.Console.WriteLine("Hello, world!") 
    End Sub
End Module

Yukarıdaki örnekte, tanımlayıcı System ad alanına Systemdeğil sınıfına Systembağlandığından ilk yöntem çağrısı geçersizdir. Ad alanına erişmenin System tek yolu, en dıştaki ad alanına kaçmak için kullanmaktır Global .

Erişilen üye paylaşılırsa, dönemin sol tarafındaki ifadeler gereksizdir ve üye erişimi geç bağlanmadığı sürece değerlendirilmez. Örneğin, aşağıdaki kodu göz önünde bulundurun:

Class C
    Public Shared F As Integer = 10
End Class

Module Test
    Public Function ReturnC() As C
        Console.WriteLine("Returning a new instance of C.")
        Return New C()
    End Function

    Public Sub Main()
        Console.WriteLine("The value of F is: " & ReturnC().F)
    End Sub
End Module

paylaşılan üyeye Ferişmek için bir örneği sağlamak için işlevinin CReturnC çağrılması gerekmediğinden yazdırılırThe value of F is: 10.

Özdeş Tür ve Üye Adları

Üyeleri türleriyle aynı adı kullanarak adlandırmak sık karşılaşılan bir durum değildir. Ancak bu durumda uygunsuz ad gizleme işlemi gerçekleşebilir:

Enum Color
    Red
    Green
    Yellow
End Enum

Class Test
    ReadOnly Property Color() As Color
        Get
            Return Color.Red
        End Get
    End Property

    Shared Function DefaultColor() As Color
        Return Color.Green    ' Binds to the instance property!
    End Function
End Class

Önceki örnekte, içindeki DefaultColor basit ad Color türü yerine instance özelliğine bağlanır. Paylaşılan bir üyede örnek üyesine başvurulamadığından bu normalde bir hata olur.

Ancak, özel bir kural bu durumda türüne erişim sağlar. Üye erişim ifadesinin temel ifadesi basit bir adsa ve türü aynı ada sahip bir sabite, alana, özelliğe, yerel değişkene veya parametreye bağlanıyorsa, temel ifade üyeye veya türe başvurabilir. Her iki üyeden de erişilebilen üyeler aynı olduğundan bu hiçbir zaman belirsizlikle sonuçlanamaz.

Varsayılan Örnekler

Bazı durumlarda, genellikle ortak bir temel sınıftan türetilen sınıflar veya her zaman tek bir örneği vardır. Örneğin, bir kullanıcı arabiriminde gösterilen çoğu pencerede herhangi bir zamanda yalnızca bir örnek gösterilir. Bu tür sınıflarla çalışmayı basitleştirmek için Visual Basic, her sınıf için tek ve kolayca başvurulan bir örnek sağlayan sınıfların varsayılan örneklerini otomatik olarak oluşturabilir.

Varsayılan örnekler her zaman belirli bir tür yerine bir tür ailesi için oluşturulur. Bu nedenle Form1 sınıfında Form'dan türetilen varsayılan bir örnek oluşturmak yerine, Form'dan türetilen tüm sınıflar için varsayılan örnekler oluşturulur. Bu, temel sınıftan türetilen her bir sınıfın varsayılan örneğe sahip olması için özel olarak işaretlenmesi gerekmediği anlamına gelir.

Bir sınıfın varsayılan örneği, bu sınıfın varsayılan örneğini döndüren derleyici tarafından oluşturulan bir özellik ile temsil edilir. Belirli bir temel sınıftan türetilen tüm sınıflar için varsayılan örnekleri ayırmayı ve yok etme işlemini yöneten grup sınıfı adlı bir sınıfın üyesi olarak oluşturulan özellik. Örneğin, sınıfından türetilen Form sınıfların varsayılan örnek özelliklerinin tümü toplanabilir MyForms . grup sınıfının bir örneği ifadesi My.Formstarafından döndürülürse, aşağıdaki kod türetilmiş sınıfların Form1 varsayılan örneklerine ve Form2erişir:

Class Form1
    Inherits Form
    Public x As Integer
End Class

Class Form2
    Inherits Form
    Public y As Integer
End Class

Module Main
    Sub Main()
        My.Forms.Form1.x = 10
        Console.WriteLine(My.Forms.Form2.y)
    End Sub
End Module

Varsayılan örnekler ilk başvuruya kadar oluşturulmaz; varsayılan örneği temsil eden özelliğin getirilmesi, önceden oluşturulmamışsa veya olarak ayarlanmışsa varsayılan örneğin oluşturulmasına Nothingneden olur. Varsayılan örneğin varlığının test edilmesine izin vermek için, varsayılan örnek bir Is veya IsNot işlecinin hedefi olduğunda, varsayılan örnek oluşturulmaz. Bu nedenle, varsayılan örneğin oluşturulmasına neden olmadan varsayılan örneğin mi yoksa başka bir başvuru mu olduğunu Nothing test etmek mümkündür.

Varsayılan örnekler, varsayılan örneğe sahip sınıfın dışından varsayılan örneğe başvurmayı kolaylaştırmaya yöneliktir. Bunu tanımlayan bir sınıfın içinden varsayılan bir örnek kullanmak, hangi örneğe başvurulmakta olduğu(varsayılan örnek veya geçerli örnek) konusunda karışıklığa neden olabilir. Örneğin, aşağıdaki kod başka bir örnekten çağrılsa bile yalnızca varsayılan örnekteki değeri x değiştirir. Bu nedenle kod değeri 5 yerine 10yazdırır:

Class Form1
    Inherits Form

    Public x As Integer = 5

    Public Sub ChangeX()
        Form1.x = 10
    End Sub
End Class

Module Main
    Sub Main()
        Dim f As Form1 = New Form1()
        f.ChangeX()
        Console.WriteLine(f.x)
    End Sub
End Module

Bu tür bir karışıklığı önlemek için, varsayılan örneğin türündeki bir örnek yönteminin içinden varsayılan örneğe başvurmak geçerli değildir.

Varsayılan Örnekler ve Tür Adları

Varsayılan örneğe doğrudan türünün adıyla da erişilebilir. Bu durumda, tür adına izin verilmeyen herhangi bir ifade bağlamında, sınıfın varsayılan örneğiyle tam adını temsil eden E ifadesi Eolarak değiştirilirE'. BuradaE', varsayılan örnek özelliğini getiren bir ifadeyi temsil eder. Örneğin, tür adından Form türetilen sınıfların varsayılan örnekleri varsayılan örneğe tür adı üzerinden erişmeye izin verirse, aşağıdaki kod önceki örnekteki kodla eşdeğerdir:

Module Main
    Sub Main()
        Form1.x = 10
        Console.WriteLine(Form2.y)
    End Sub
End Module

Bu, türünün adıyla erişilebilen varsayılan bir örneğin de tür adı aracılığıyla atanabilir olduğu anlamına gelir. Örneğin, aşağıdaki kod varsayılan örneğini Form1 olarak Nothingayarlar:

Module Main
    Sub Main()
        Form1 = Nothing
    End Sub
End Module

öğesinin anlamının E.IE bir sınıfı temsil ettiğini ve I paylaşılan bir üyeyi temsil ettiğini unutmayın. Böyle bir ifade, paylaşılan üyeye sınıf örneğinden doğrudan erişir ve varsayılan örneğe başvurmaz.

Grup Sınıfları

özniteliği, Microsoft.VisualBasic.MyGroupCollectionAttribute varsayılan örnek ailesi için grup sınıfını gösterir. özniteliğinin dört parametresi vardır:

  • parametresi TypeToCollect , grubun temel sınıfını belirtir. Bu ada sahip bir türden türetilen açık tür parametreleri olmayan tüm örneklenebilir sınıfların (tür parametreleri ne olursa olsun) otomatik olarak bir varsayılan örneği olur.

  • parametresi CreateInstanceMethodName , varsayılan örnek özelliğinde yeni bir örnek oluşturmak için grup sınıfında çağrılacak yöntemi belirtir.

  • parametresi DisposeInstanceMethodName , varsayılan örnek özelliğine değeri Nothingatandıysa, varsayılan örnek özelliğini atmak için grup sınıfında çağrılacak yöntemi belirtir.

  • parametresi DefaultInstanceAlias , varsayılan örneklere doğrudan kendi tür adları üzerinden erişilebiliyorsa, sınıf adı yerine kullanılacak ifadeye E' özeldir. Bu parametre Nothing veya boş bir dizeyse, bu grup türündeki varsayılan örneklere doğrudan türlerinin adıyla erişilemez. (Not. Visual Basic dilinin tüm geçerli uygulamalarında, DefaultInstanceAlias derleyici tarafından sağlanan kod dışında parametresi yoksayılır.)

Birden çok tür, ilk üç parametredeki türlerin ve yöntemlerin adları virgül kullanılarak ayrılarak aynı gruba toplanabilir. Her parametrede aynı sayıda öğe olmalıdır ve liste öğeleri sırayla eşleştirilir. Örneğin, aşağıdaki öznitelik bildirimi, C2 türünden C1veya C3 tek bir gruba türetilen türleri toplar:

<Microsoft.VisualBasic.MyGroupCollection("C1, C2, C3", _
    "CreateC1, CreateC2, CreateC3", _
    "DisposeC1, DisposeC2, DisposeC3", "My.Cs")>
Public NotInheritable Class MyCs
    ...
End Class

Oluşturma yönteminin imzası biçiminde Shared Function <Name>(Of T As {New, <Type>})(Instance Of T) As Tolmalıdır. Dispose yöntemi biçiminde Shared Sub <Name>(Of T As <Type>)(ByRef Instance Of T)olmalıdır. Bu nedenle, önceki bölümdeki örneğin grup sınıfı aşağıdaki gibi bildirilebilir:

<Microsoft.VisualBasic.MyGroupCollection("Form", "Create", _
    "Dispose", "My.Forms")> _
Public NotInheritable Class MyForms
    Private Shared Function Create(Of T As {New, Form}) _
        (Instance As T) As T
        If Instance Is Nothing Then
            Return New T()
        Else
            Return Instance
        End If
    End Function

    Private Shared Sub Dispose(Of T As Form)(ByRef Instance As T)
        Instance.Close()
        Instance = Nothing
    End Sub
End Class

Kaynak dosya türetilmiş bir sınıf Form1bildirmişse, oluşturulan grup sınıfı aşağıdakine eşdeğer olacaktır:

<Microsoft.VisualBasic.MyGroupCollection("Form", "Create", _
    "Dispose", "My.Forms")> _
Public NotInheritable Class MyForms
    Private Shared Function Create(Of T As {New, Form}) _
        (Instance As T) As T
        If Instance Is Nothing Then
            Return New T()
        Else
            Return Instance
        End If
    End Function

    Private Shared Sub Dispose(Of T As Form)(ByRef Instance As T)
        Instance.Close()
        Instance = Nothing
    End Sub

    Private m_Form1 As Form1

    Public Property Form1() As Form1
        Get
            Return Create(m_Form1)
        End Get
        Set (Value As Form1)
            If Value IsNot Nothing AndAlso Value IsNot m_Form1 Then
                Throw New ArgumentException( _
                    "Property can only be set to Nothing.")
            End If
            Dispose(m_Form1)
        End Set
    End Property
End Class

Uzantı Yöntemi Koleksiyonu

Üye erişim ifadesi E.I için uzantı yöntemleri, geçerli bağlamda kullanılabilen adla I tüm uzantı yöntemleri toplanarak toplanır:

  1. İlk olarak, ifadeyi içeren iç içe her tür, en içten başlayıp en dışa doğru işaretlenir.
  2. Ardından iç içe yerleştirilmiş her ad alanı, en içteki ad alanından başlayıp en dıştaki ad alanına giderek denetlenır.
  3. Ardından, kaynak dosyadaki içeri aktarmalar denetleniyor.
  4. Ardından, derleme ortamı tarafından tanımlanan içeri aktarmalar denetleniyor.

Bir uzantı yöntemi yalnızca hedef ifade türünden uzantı yönteminin ilk parametresinin türüne genişleten bir yerel dönüştürme varsa toplanır. Normal basit ad ifadesi bağlamasının aksine, arama tüm uzantı yöntemlerini toplar; bir uzantı yöntemi bulunduğunda koleksiyon durmaz. Örneğin:

Imports System.Runtime.CompilerServices

Class C1
End Class


Namespace N1
    Module N1C1Extensions
        <Extension> _
        Sub M1(c As C1, x As Integer)
        End Sub
    End Module
End Namespace

Namespace N1.N2
    Module N2C1Extensions
        <Extension> _
        Sub M1(c As C1, y As Double)
        End Sub
    End Module
End Namespace

Namespace N1.N2.N3
    Module Test
        Sub Main()
            Dim x As New C1()

            ' Calls N1C1Extensions.M1
            x.M1(10)
        End Sub
    End Module
End Namespace

Bu örnekte, öncesinde N1C1Extensions.M1bulunsa N2C1Extensions.M1 da her ikisi de uzantı yöntemleri olarak kabul edilir. Uzantı yöntemlerinin tümü toplandıktan sonra curried edilir. Currying, uzantı yöntemi çağrısının hedefini alır ve uzantı yöntemi çağrısına uygular ve bu da ilk parametrenin kaldırılmasıyla (belirtildiği için) yeni bir yöntem imzası elde eder. Örneğin:

Imports System.Runtime.CompilerServices

Module Ext1
    <Extension> _
    Sub M(x As Integer, y As Integer)
    End Sub
End Module

Module Ext2
    <Extension> _
    Sub M(x As Integer, y As Double)
    End Sub
End Module

Module Main
    Sub Test()
        Dim v As Integer = 10

        ' The curried method signatures considered are:
        '        Ext1.M(y As Integer)
        '        Ext2.M(y As Double)
        v.M(10)
    End Sub
End Module

Yukarıdaki örnekte, 'a Ext1.M uygulamanın v curried sonucu yöntem imzasıdırSub M(y As Integer).

Uzantı yönteminin ilk parametresini kaldırmanın yanı sıra currying, ilk parametre türünün parçası olan yöntem türü parametrelerini de kaldırır. Yöntem türü parametresiyle bir uzantı yöntemi köri oluştururken, ilk parametreye tür çıkarımı uygulanır ve sonuç, çıkarsanan tüm tür parametreleri için düzeltilir. Tür çıkarımı başarısız olursa yöntemi yoksayılır. Örneğin:

Imports System.Runtime.CompilerServices

Module Ext1
    <Extension> _
    Sub M(Of T, U)(x As T, y As U)
    End Sub
End Module

Module Ext2
    <Extension> _
    Sub M(Of T)(x As T, y As T)
    End Sub
End Module

Module Main
    Sub Test()
        Dim v As Integer = 10

        ' The curried method signatures considered are:
        '        Ext1.M(Of U)(y As U)
        '        Ext2.M(y As Integer)
        v.M(10)
    End Sub
End Module

Yukarıdaki örnekte, tür parametresi currying vExt1.M sonucu olarak çıkarıldığından ve artık düzeltildiğinden, için uygulanan curried sonucu yöntem imzasıdırSub M(Of U)(y As U).T Tür parametresi U currying'in bir parçası olarak çıkarılmadığından, açık bir parametre olarak kalır. Benzer şekilde, tür parametresi T uygulaması Ext2.Mv sonucunda çıkarılabildiğinden parametre y türü olarak Integersabitlenir. Başka bir tür olduğu çıkarılmaz. İmzayı körerken, kısıtlamalar dışındaki New tüm kısıtlamalar da uygulanır. Kısıtlamalar karşılanmazsa veya currying'in bir parçası olarak çıkarılmayan bir türe bağlıysa, uzantı yöntemi yoksayılır. Örneğin:

Imports System.Runtime.CompilerServices

Module Ext1
    <Extension> _
    Sub M1(Of T As Structure)(x As T, y As Integer)
    End Sub

    <Extension> _
    Sub M2(Of T As U, U)(x As T, y As U)
    End Sub
End Module

Module Main
    Sub Test()
        Dim s As String = "abc"

        ' Error: String does not satisfy the Structure constraint
        s.M1(10)

        ' Error: T depends on U, which cannot be inferred
        s.M2(10)
    End Sub
End Module

Not. Uzantı yöntemlerinin currying işlemini yapmanın temel nedenlerinden biri, sorgu ifadelerinin bağımsız değişkenleri sorgu desen yöntemiyle değerlendirmeden önce yineleme türünü çıkarmasına izin vermesidir. Sorgu deseni yöntemlerinin çoğu, tür çıkarımı gerektiren lambda ifadelerini aldığı için bu, sorgu ifadesini değerlendirme işlemini büyük ölçüde basitleştirir.

Normal arabirim devralmadan farklı olarak, birbiriyle ilişkisi olmayan iki arabirimi genişleten uzantı yöntemleri, aynı curried imzaya sahip olmadığı sürece kullanılabilir:

Imports System.Runtime.CompilerServices

Interface I1
End Interface

Interface I2
End Interface

Class C1
    Implements I1, I2
End Class

Module I1Ext
    <Extension> _
    Sub M1(i As I1, x As Integer)
    End Sub

    <Extension> _
    Sub M2(i As I1, x As Integer)
    End Sub
End Module

Module I2Ext
    <Extension> _
    Sub M1(i As I2, x As Integer)
    End Sub

    <Extension> _
    Sub M2(I As I2, x As Double)
    End Sub
End Module

Module Main
    Sub Test()
        Dim c As New C1()

        ' Error: M is ambiguous between I1Ext.M1 and I2Ext.M1.
        c.M1(10)

        ' Calls I1Ext.M2
        c.M2(10)
    End Sub
End Module

Son olarak, geç bağlama yapılırken uzantı yöntemlerinin dikkate alınmadığını unutmayın:

Module Test
    Sub Main()
        Dim o As Object = ...

        ' Ignores extension methods
        o.M1()
    End Sub
End Module

Sözlük Üyesi Erişim İfadeleri

Sözlük üyesi erişim ifadesi , bir koleksiyonun üyesini aramak için kullanılır. Sözlük üyesi erişimi biçimindedir E!I; burada E değer olarak sınıflandırılan ve I tanımlayıcı olan bir ifadedir.

DictionaryAccessExpression
    : Expression? '!' IdentifierOrKeyword
    ;

İfadenin türü, tek String bir parametre tarafından dizine alınan varsayılan bir özelliğe sahip olmalıdır. Sözlük üyesi erişim ifadesi E!I ifadeye E.D("I")dönüştürülür; burada D varsayılan özelliğidir E. Örneğin:

Class Keys
    Public ReadOnly Default Property Item(s As String) As Integer
        Get
            Return 10
        End Get
    End Property 
End Class

Module Test
    Sub Main()
        Dim x As Keys = new Keys()
        Dim y As Integer
        ' The two statements are equivalent.
        y = x!abc
        y = x("abc")
    End Sub
End Module

İfade olmadan bir ünlem işareti belirtilirse, hemen içeren With deyiminden ifade varsayılır. İçeren With bir deyim yoksa derleme zamanı hatası oluşur.

Çağırma İfadeleri

Çağırma ifadesi bir çağırma hedefi ve isteğe bağlı bağımsız değişken listesinden oluşur.

InvocationExpression
    : Expression ( OpenParenthesis ArgumentList? CloseParenthesis )?
    ;

ArgumentList
    : PositionalArgumentList
    | PositionalArgumentList Comma NamedArgumentList
    | NamedArgumentList
    ;

PositionalArgumentList
    : Expression? ( Comma Expression? )*
    ;

NamedArgumentList
    : IdentifierOrKeyword ColonEquals Expression
      ( Comma IdentifierOrKeyword ColonEquals Expression )*
    ;

Hedef ifade, bir yöntem grubu veya türü temsilci türü olan bir değer olarak sınıflandırılmalıdır. Hedef ifade türü temsilci türü olan bir değerse, çağırma ifadesinin hedefi temsilci türünün üyesi için Invoke yöntem grubu olur ve hedef ifade yöntem grubunun ilişkili hedef ifadesi olur.

Bağımsız değişken listesinde iki bölüm vardır: konumsal bağımsız değişkenler ve adlandırılmış bağımsız değişkenler. Konumsal bağımsız değişkenler ifadelerdir ve adlandırılmış bağımsız değişkenlerden önce olmalıdır. Adlandırılmış bağımsız değişkenler , anahtar sözcüklerle ve ardından := bir ifadeyle eşleşebilen bir tanımlayıcıyla başlar.

Yöntem grubu hem örnek hem de uzantı yöntemleri de dahil olmak üzere yalnızca bir erişilebilir yöntem içeriyorsa ve bu yöntem bağımsız değişken almazsa ve bir işlevse, yöntem grubu boş bağımsız değişken listesi olan bir çağırma ifadesi olarak yorumlanır ve sonuç, sağlanan bağımsız değişken listeleriyle çağırma ifadesinin hedefi olarak kullanılır. Örneğin:

Class C1
    Function M1() As Integer()
        Return New Integer() { 1, 2, 3 }
    End Sub
End Class

Module Test
    Sub Main()
        Dim c As New C1()

        ' Prints 3
        Console.WriteLine(c.M1(2))
    End Sub
End Module

Aksi takdirde, belirtilen bağımsız değişken listeleri için en uygun yöntemi seçmek üzere yöntemlere aşırı yükleme çözümlemesi uygulanır. En uygun yöntem bir işlevse, çağırma ifadesinin sonucu işlevin dönüş türü olarak yazılan bir değer olarak sınıflandırılır. En uygun yöntem bir alt yordamsa sonuç geçersiz olarak sınıflandırılır. En uygun yöntem gövdesi olmayan kısmi bir yöntemse, çağırma ifadesi yoksayılır ve sonuç geçersiz olarak sınıflandırılır.

Erken bağlanan bir çağırma ifadesi için bağımsız değişkenler, karşılık gelen parametrelerin hedef yöntemde bildirildiği sırayla değerlendirilir. Geç bağlanan üye erişim ifadesi için, bunlar üye erişim ifadesinde göründükleri sırayla değerlendirilir: Bkz. Bölüm Late-Bound İfadeleri.

Aşırı Yüklenmiş Yöntem Çözümlemesi:

Aşırı Yükleme Çözümlemesi için, bağımsız değişken listesi verilen üyelerin/türlerin özgülüğü, Genellik, Bağımsız Değişken Listesine Uygulanabilirlik, Bağımsız Değişkenleri Geçirme ve İsteğe Bağlı Parametreler, Koşullu Yöntemler ve Tür Bağımsız Değişken Çıkarımı için Bağımsız Değişkenleri Seçme: bkz. Bölüm Aşırı Yükleme Çözümlemesi.

Dizin İfadeleri

Dizin ifadesi bir dizi öğesine neden olur veya bir özellik grubunu özellik erişimine yeniden sınıflandırır. Dizin ifadesi sırasıyla bir ifade, bir açma parantezi, bir dizin bağımsız değişken listesi ve bir kapatma parantezi içerir.

IndexExpression
    : Expression OpenParenthesis ArgumentList? CloseParenthesis
    ;

Dizin ifadesinin hedefi bir özellik grubu veya değer olarak sınıflandırılmalıdır. Dizin ifadesi aşağıdaki gibi işlenir:

  • Hedef ifade bir değer olarak sınıflandırılmışsa ve türü bir dizi türü, veya System.Arraydeğilse, Objecttürün varsayılan özelliği olmalıdır. Dizin, türün tüm varsayılan özelliklerini temsil eden bir özellik grubunda gerçekleştirilir. Visual Basic'te parametresiz bir varsayılan özellik bildirmek geçerli olmasa da, diğer diller böyle bir özelliğin bildirilmesine izin verebilir. Sonuç olarak, bağımsız değişken içermeyen bir özelliği dizine eklemeye izin verilir.

  • İfade bir dizi türü değeriyle sonuçlanırsa, bağımsız değişken listesindeki bağımsız değişkenlerin sayısı dizi türünün derecesiyle aynı olmalıdır ve adlandırılmış bağımsız değişkenleri içermeyebilir. Dizinlerden herhangi biri çalışma zamanında geçersizse, bir System.IndexOutOfRangeException özel durum oluşturulur. Her ifade türüne Integerörtük olarak dönüştürülebilir olmalıdır. Dizin ifadesinin sonucu, belirtilen dizindeki değişkendir ve değişken olarak sınıflandırılır.

  • İfade bir özellik grubu olarak sınıflandırılırsa, özelliklerden birinin dizin bağımsız değişkeni listesi için geçerli olup olmadığını belirlemek için aşırı yükleme çözümlemesi kullanılır. Özellik grubu yalnızca bir erişimciye sahip bir Get özellik içeriyorsa ve bu erişimci bağımsız değişken almazsa, özellik grubu boş bağımsız değişken listesi olan bir dizin ifadesi olarak yorumlanır. Sonuç, geçerli dizin ifadesinin hedefi olarak kullanılır. Geçerli özellik yoksa derleme zamanı hatası oluşur. Aksi takdirde ifade, özellik grubunun ilişkili hedef ifadesiyle (varsa) bir özellik erişimine neden olur.

  • İfade, geç bağlanan özellik grubu veya türü Object veya System.Arrayolan bir değer olarak sınıflandırılırsa, dizin ifadesinin işlenmesi çalışma zamanına kadar ertelenirse ve dizin oluşturma geç bağlıdır. İfade, olarak Objectyazılan geç bağlı özellik erişimiyle sonuçlanmıştır. İlişkili hedef ifade, bir değerse hedef ifade veya özellik grubunun ilişkili hedef ifadesidir. Çalışma zamanında ifade aşağıdaki gibi işlenir:

  • İfade geç bağlanan özellik grubu olarak sınıflandırılırsa, ifade bir yöntem grubuna, özellik grubuna veya değere (üye bir örnek veya paylaşılan değişkense) neden olabilir. Sonuç bir yöntem grubu veya özellik grubuysa, bağımsız değişken listesi için doğru yöntemi belirlemek üzere gruba aşırı yükleme çözümlemesi uygulanır. Aşırı yükleme çözümlemesi başarısız olursa bir System.Reflection.AmbiguousMatchException özel durum oluşturulur. Ardından sonuç, özellik erişimi olarak veya çağrı olarak işlenir ve sonuç döndürülür. Çağrı bir alt yordamdan kaynaklanıyorsa, sonuç olur Nothing.

  • Hedef ifadenin çalışma zamanı türü bir dizi türü veya System.Arrayise, dizin ifadesinin sonucu belirtilen dizindeki değişkenin değeridir.

  • Aksi takdirde, ifadenin çalışma zamanı türü varsayılan bir özelliğe sahip olmalıdır ve dizin, türdeki tüm varsayılan özellikleri temsil eden özellik grubunda gerçekleştirilir. Türün varsayılan özelliği yoksa bir System.MissingMemberException özel durum oluşturulur.

Yeni İfadeler

New işleci, yeni tür örnekleri oluşturmak için kullanılır. Dört ifade biçimi New vardır:

  • Nesne oluşturma ifadeleri, sınıf türlerinin ve değer türlerinin yeni örneklerini oluşturmak için kullanılır.

  • Dizi oluşturma ifadeleri, dizi türlerinin yeni örneklerini oluşturmak için kullanılır.

  • Temsilci oluşturma ifadeleri (nesne oluşturma ifadelerinden ayrı bir söz dizimi olmayan) temsilci türlerinin yeni örneklerini oluşturmak için kullanılır.

  • Anonim nesne oluşturma ifadeleri, anonim sınıf türlerinin yeni örneklerini oluşturmak için kullanılır.

NewExpression
    : ObjectCreationExpression
    | ArrayExpression
    | AnonymousObjectCreationExpression
    ;

İfade New bir değer olarak sınıflandırılır ve sonuç türün yeni örneğidir.

Object-Creation İfadeleri

Nesne oluşturma ifadesi, bir sınıf türünün veya yapı türünün yeni bir örneğini oluşturmak için kullanılır.

ObjectCreationExpression
    : 'New' NonArrayTypeName ( OpenParenthesis ArgumentList? CloseParenthesis )?
      ObjectCreationExpressionInitializer?
    ;

ObjectCreationExpressionInitializer
    : ObjectMemberInitializer
    | ObjectCollectionInitializer
    ;

ObjectMemberInitializer
    : 'With' OpenCurlyBrace FieldInitializerList CloseCurlyBrace
    ;

FieldInitializerList
    : FieldInitializer ( Comma FieldInitializer )*
    ;

FieldInitializer
    : 'Key'? ('.' IdentifierOrKeyword Equals )? Expression
    ;

ObjectCollectionInitializer
    : 'From' CollectionInitializer
    ;

CollectionInitializer
    : OpenCurlyBrace CollectionElementList? CloseCurlyBrace
    ;

CollectionElementList
    : CollectionElement ( Comma CollectionElement )*
    ;

CollectionElement
    : Expression
    | CollectionInitializer
    ;

Nesne oluşturma ifadesinin türü bir sınıf türü, yapı türü veya kısıtlaması olan New bir tür parametresi olmalıdır ve sınıf olamaz MustInherit . biçiminin New T(A)nesne oluşturma ifadesi verildiğinde, burada T bir sınıf türü veya yapı türüdür ve A isteğe bağlı bir bağımsız değişken listesidir, aşırı yükleme çözümlemesi çağrılacak doğru oluşturucuyu T belirler. Kısıtlaması olan bir New tür parametresinin tek, parametresiz bir oluşturucuya sahip olduğu kabul edilir. Hiçbir oluşturucu çağrılamazsa, derleme zamanı hatası oluşur; aksi takdirde ifade, seçilen oluşturucuyu kullanmanın yeni bir örneğinin T oluşturulmasına neden olur. Bağımsız değişken yoksa parantezler atlanabilir.

Örneğin nereye ayrıldığı, örneğin bir sınıf türü mü yoksa bir değer türü mü olduğuna bağlıdır. New sınıf türlerinin örnekleri sistem yığınında oluşturulurken, değer türlerinin yeni örnekleri doğrudan yığında oluşturulur.

Nesne oluşturma ifadesi, oluşturucu bağımsız değişkenlerinden sonra isteğe bağlı olarak bir üye başlatıcı listesi belirtebilir. Bu üye başlatıcılara anahtar sözcüğü Withön eklenmiştir ve başlatıcı listesi bir With deyimi bağlamındaymış gibi yorumlanır. Örneğin, sınıfı göz önünde bulundurulduğunda:

Class Customer
    Dim Name As String
    Dim Address As String
End Class

Kod:

Module Test
    Sub Main()
        Dim x As New Customer() With { .Name = "Bob Smith", _
            .Address = "123 Main St." }
    End Sub
End Module

Kabaca şu değerle eşdeğerdir:

Module Test
    Sub Main()
        Dim x, _t1 As Customer

        _t1 = New Customer()
        With _t1
            .Name = "Bob Smith"
            .Address = "123 Main St."
        End With

        x = _t1
    End Sub
End Module

Her başlatıcının atanacak bir ad belirtmesi ve adın oluşturulmakta olan türün örnek olmayanReadOnly bir değişkeni veya özelliği olması gerekir; oluşturulmakta olan tür Objectise üye erişimi geç bağlanmaz. Başlatıcılar anahtar sözcüğünü Key kullanmayabilir. Bir türdeki her üye yalnızca bir kez başlatılabilir. Ancak başlatıcı ifadeleri birbirine başvurabilir. Örneğin:

Module Test
    Sub Main()
        Dim x As New Customer() With { .Name = "Bob Smith", _
            .Address = .Name & " St." }
    End Sub
End Module

Başlatıcılar soldan sağa atanır, dolayısıyla başlatıcı henüz başlatılmamış bir üyeye başvuruyorsa, oluşturucu çalıştıktan sonra örnek değişkeninin değeri ne olursa olsun görür:

Module Test
    Sub Main()
        ' The value of Address will be " St." since Name has not been
        ' assigned yet.
        Dim x As New Customer() With { .Address = .Name & " St." }
    End Sub
End Module

Başlatıcılar iç içe yerleştirilebilir:

Class Customer
    Dim Name As String
    Dim Address As Address
    Dim Age As Integer
End Class

Class Address
    Dim Street As String
    Dim City As String
    Dim State As String
    Dim ZIP As String
End Class

Module Test
    Sub Main()
        Dim c As New Customer() With { _
            .Name = "John Smith", _
            .Address = New Address() With { _
                .Street = "23 Main St.", _
                .City = "Peoria", _
                .State = "IL", _
                .ZIP = "13934" }, _
            .Age = 34 }
    End Sub
End Module

Oluşturulan tür bir koleksiyon türüyse ve adlı Add bir örnek yöntemine sahipse (uzantı yöntemleri ve paylaşılan yöntemler dahil), nesne oluşturma ifadesi anahtar sözcüğüyle Fromönek olarak bir koleksiyon başlatıcı belirtebilir. Nesne oluşturma ifadesi hem üye başlatıcı hem de koleksiyon başlatıcı belirtemez. Koleksiyon başlatıcıdaki her öğe, işlevin çağrılması Add için bağımsız değişken olarak geçirilir. Örneğin:

Dim list = New List(Of Integer)() From { 1, 2, 3, 4 }

eşdeğerdir:

Dim list = New List(Of Integer)()
list.Add(1)
list.Add(2)
list.Add(3)

Bir öğe bir koleksiyon başlatıcısı ise, alt koleksiyon başlatıcısının her öğesi işleve Add bağımsız değişken olarak geçirilir. Örneğin, aşağıdakiler:

Dim dict = Dictionary(Of Integer, String) From { { 1, "One" },{ 2, "Two" } }

eşdeğerdir:

Dim dict = New Dictionary(Of Integer, String)
dict.Add(1, "One")
dict.Add(2, "Two")

Bu genişletme her zaman yapılır ve yalnızca bir düzey derin yapılır; bundan sonra, alt başlatıcılar dizi değişmez değerleri olarak kabul edilir. Örneğin:

' Error: List(Of T) does not have an Add method that takes two parameters.
Dim list = New List(Of Integer())() From { { 1, 2 }, { 3, 4 } }

' OK, this initializes the dictionary with (Integer, Integer()) pairs.
Dim dict = New Dictionary(Of Integer, Integer())() From _
        { {  1, { 2, 3 } }, { 3, { 4, 5 } } }

Dizi İfadeleri

Dizi ifadesi, dizi türünün yeni bir örneğini oluşturmak için kullanılır. İki tür dizi ifadesi vardır: dizi oluşturma ifadeleri ve dizi değişmez değerleri.

Dizi oluşturma ifadeleri

Dizi boyutu başlatma değiştiricisi sağlanırsa, sonuçta elde edilen dizi türü, bağımsız değişkenlerin her biri dizi boyutu başlatma bağımsız değişkeni listesinden silinerek türetilir. Her bağımsız değişkenin değeri, yeni ayrılan dizi örneğindeki ilgili boyutun üst sınırlarını belirler. İfadenin boş olmayan bir koleksiyon başlatıcısı varsa, bağımsız değişken listesindeki her bağımsız değişken bir sabit olmalıdır ve ifade listesi tarafından belirtilen derece ve boyut uzunlukları koleksiyon başlatıcısınınkilerle eşleşmelidir.

Dim a() As Integer = New Integer(2) {}
Dim b() As Integer = New Integer(2) { 1, 2, 3 }
Dim c(,) As Integer = New Integer(1, 2) { { 1, 2, 3 } , { 4, 5, 6 } }

' Error, length/initializer mismatch.
Dim d() As Integer = New Integer(2) { 0, 1, 2, 3 }

Dizi boyutu başlatma değiştiricisi sağlanmazsa, tür adı bir dizi türü olmalı ve koleksiyon başlatıcısı boş olmalı veya belirtilen dizi türünün sıralamasıyla aynı sayıda iç içe yerleştirme düzeyine sahip olmalıdır. En iç içe yerleştirme düzeyindeki tüm öğelerin, dizinin öğe türüne örtük olarak dönüştürülebilir olması ve değer olarak sınıflandırılması gerekir. her iç içe koleksiyon başlatıcıdaki öğelerin sayısı her zaman aynı düzeydeki diğer koleksiyonların boyutuyla tutarlı olmalıdır. Tek tek boyut uzunlukları, koleksiyon başlatıcısının ilgili iç içe yerleştirme düzeylerinin her birindeki öğe sayısından çıkarılır. Koleksiyon başlatıcısı boşsa, her boyutun uzunluğu sıfırdır.

Dim e() As Integer = New Integer() { 1, 2, 3 }
Dim f(,) As Integer = New Integer(,) { { 1, 2, 3 } , { 4, 5, 6 } }

' Error: Inconsistent numbers of elements!
Dim g(,) As Integer = New Integer(,) { { 1, 2 }, { 4, 5, 6 } }

' Error: Inconsistent levels of nesting!
Dim h(,) As Integer = New Integer(,) { 1, 2, { 3, 4 } }

Koleksiyon başlatıcısının en dıştaki iç içe yerleştirme düzeyi bir dizinin en soldaki boyutuna, en iç içe yerleştirme düzeyi ise en sağdaki boyuta karşılık gelir. Örnek:

Dim array As Integer(,) = _
    { { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 }, { 8, 9 } }

Aşağıdakilere eşdeğerdir:

Dim array(4, 1) As Integer

array(0, 0) = 0: array(0, 1) = 1
array(1, 0) = 2: array(1, 1) = 3
array(2, 0) = 4: array(2, 1) = 5
array(3, 0) = 6: array(3, 1) = 7
array(4, 0) = 8: array(4, 1) = 9

Koleksiyon başlatıcısı boşsa (küme ayraçları içeren ancak başlatıcı listesi olmayan) ve başlatılmakta olan dizinin boyutlarının sınırları biliniyorsa, boş koleksiyon başlatıcı tüm öğelerin öğe türünün varsayılan değerine başlatıldığı belirtilen boyutta bir dizi örneğini temsil eder. Başlatılmakta olan dizinin boyutlarının sınırları bilinmiyorsa, boş koleksiyon başlatıcısı tüm boyutların sıfır boyutu olduğu bir dizi örneğini temsil eder.

Bir dizi örneğinin derecelendirmesi ve her boyutun uzunluğu, örneğin tüm ömrü boyunca sabittir. Başka bir deyişle, mevcut bir dizi örneğinin derecesini değiştirmek mümkün değildir ve boyutlarını yeniden boyutlandırmak mümkün değildir.

Dizi Değişmez Değerleri

Dizi değişmez değeri, öğe türü, derecelendirmesi ve sınırları ifade bağlamı ile koleksiyon başlatıcısının birleşiminden çıkarılmış bir diziyi belirtir. Bu, Bölüm İfadesi Yeniden Sınıflandırma bölümünde açıklanmıştır.

ArrayExpression
    : ArrayCreationExpression
    | ArrayLiteralExpression
    ;

ArrayCreationExpression
    : 'New' NonArrayTypeName ArrayNameModifier CollectionInitializer
    ;

ArrayLiteralExpression
    : CollectionInitializer
    ;

Örneğin:

' array of integers
Dim a = {1, 2, 3}

' array of shorts
Dim b = {1S, 2S, 3S}

' array of shorts whose type is taken from the context
Dim c As Short() = {1, 2, 3}

' array of type Integer(,)
Dim d = {{1, 0}, {0, 1}}

' jagged array of rank ()()
Dim e = {({1, 0}), ({0, 1})}

' error: inconsistent rank
Dim f = {{1}, {2, 3}}

' error: inconsistent rank
Dim g = {1, {2}}

Dizi değişmez değeri içindeki koleksiyon başlatıcısının biçimi ve gereksinimleri, dizi oluşturma ifadesindeki koleksiyon başlatıcısı ile tamamen aynıdır.

Not. Dizi değişmez değeri, diziyi kendi içinde oluşturmaz; bunun yerine, ifadenin dizinin oluşturulmasına neden olan bir değer olarak yeniden sınıflandırılmasıdır. Örneğin, CType(new Integer() {1,2,3}, Short()) dönüştürme işlemi yapılamadığından dönüştürme mümkün Short()Integer() değildir; ancak ilk CType({1,2,3},Short()) olarak dizi değişmez değerini dizi oluşturma ifadesinde New Short() {1,2,3}yeniden sınıflandırır.

Delegate-Creation İfadeleri

Temsilci oluşturma ifadesi, temsilci türünün yeni bir örneğini oluşturmak için kullanılır. Temsilci oluşturma ifadesinin bağımsız değişkeni, yöntem işaretçisi veya lambda yöntemi olarak sınıflandırılmış bir ifade olmalıdır.

Bağımsız değişken bir yöntem işaretçisiyse, yöntem işaretçisi tarafından başvuruda bulunılan yöntemlerden biri temsilci türünün imzası için geçerli olmalıdır. Bir yöntem M , şu durumlarda temsilci türü D için geçerlidir:

  • M ya da Partial bir vücut var.

  • Hem hem D de M işlevleridir veya D bir alt yordamdır.

  • M ve D aynı sayıda parametreye sahiptir.

  • Her birinin M parametre türleri, karşılık gelen parametre türü türünden Dbir dönüştürmeye sahiptir ve değiştiricileri (yani ByRef, ByVal) eşleşmelidir.

  • varsa dönüş türü M, dönüş türüne dönüştürmeye Dsahiptir.

Yöntem işaretçisi geç bağlanan erişime başvuruda bulunuyorsa, geç bağlanan erişimin temsilci türüyle aynı sayıda parametreye sahip bir işleve olduğu varsayılır.

Katı semantikler kullanılmıyorsa ve yöntem işaretçisi tarafından başvuruda bulunan tek bir yöntem varsa, ancak parametresi olmadığı ve temsilci türünün kullanmadığı için uygulanamazsa, yöntem uygulanabilir kabul edilir ve parametreler veya dönüş değeri basitçe yoksayılır. Örneğin:

Delegate Sub F(x As Integer)

Module Test
    Sub M()
    End Sub

    Sub Main()
        ' Valid
        Dim x As F = AddressOf M
    End Sub
End Module

Not. Bu rahatlamaya yalnızca uzantı yöntemleri nedeniyle katı semantikler kullanılmadığında izin verilir. Uzantı yöntemleri yalnızca normal bir yöntem uygulanamazsa dikkate alındığından, parametre içermeyen bir örnek yönteminin temsilci oluşturma amacıyla bir uzantı yöntemini parametrelerle gizlemesi mümkündür.

Yöntem işaretçisi tarafından başvuruda bulunılan birden fazla yöntem temsilci türü için geçerliyse, aday yöntemleri arasında seçim yapmak için aşırı yükleme çözümlemesi kullanılır. Temsilciye parametre türleri, aşırı yükleme çözümlemesi amacıyla bağımsız değişkenlerin türleri olarak kullanılır. En uygun yöntem adayı yoksa derleme zamanı hatası oluşur. Aşağıdaki örnekte, yerel değişken ikinci Square yönteme başvuran bir temsilciyle başlatılır çünkü bu yöntem imza ve dönüş türü DoubleFunciçin daha geçerlidir.

Delegate Function DoubleFunc(x As Double) As Double

Module Test
    Function Square(x As Single) As Single
        Return x * x
    End Function 

    Function Square(x As Double) As Double
        Return x * x
    End Function

    Sub Main()
        Dim a As New DoubleFunc(AddressOf Square)
    End Sub
End Module

İkinci Square yöntem mevcut olmasaydı, ilk Square yöntem seçilirdi. Katı semantikler derleme ortamı veya tarafından Option Strictbelirtilirse, yöntem işaretçisi tarafından başvuruda bulunan en özel yöntem temsilci imzasından daha darsa derleme zamanı hatası oluşur. Yöntem M , şu durumda temsilci türünden D daha dar kabul edilir:

  • parametresinin türü, M ilgili parametre türüne yönelik genişletme dönüştürmesine Dsahiptir.

  • Veya, varsa, M dönüş türünün dönüş türüne daraltma dönüştürmesi Dvardır.

Tür bağımsız değişkenleri yöntem işaretçisiyle ilişkiliyse, yalnızca aynı sayıda tür bağımsız değişkenine sahip yöntemler dikkate alınır. Yöntem işaretçisiyle hiçbir tür bağımsız değişkeni ilişkilendirilmemişse, imzaları genel bir yöntemle eşleştirirken tür çıkarımı kullanılır. Diğer normal tür çıkarımlarından farklı olarak, tür bağımsız değişkenleri çıkarılırken temsilcinin dönüş türü kullanılır, ancak en az genel aşırı yükleme belirlenirken dönüş türleri yine de dikkate alınmaz. Aşağıdaki örnekte, temsilci oluşturma ifadesine tür bağımsız değişkeni sağlamanın her iki yolu da gösterilmektedir:

Delegate Function D(s As String, i As Integer) As Integer
Delegate Function E() As Integer

Module Test
    Public Function F(Of T)(s As String, t1 As T) As T
    End Function

    Public Function G(Of T)() As T
    End Function

    Sub Main()
        Dim d1 As D = AddressOf f(Of Integer)    ' OK, type arg explicit
        Dim d2 As D = AddressOf f                ' OK, type arg inferred

        Dim e1 As E = AddressOf g(Of Integer)    ' OK, type arg explicit
        Dim e2 As E = AddressOf g                ' OK, infer from return
  End Sub
End Module

Yukarıdaki örnekte, genel olmayan bir temsilci türü genel bir yöntem kullanılarak örneklendi. Genel bir yöntem kullanarak, oluşturulduğunda temsilci türünün bir örneğini oluşturmak da mümkündür. Örneğin:

Delegate Function Predicate(Of U)(u1 As U, u2 As U) As Boolean

Module Test
    Function Compare(Of T)(t1 As List(of T), t2 As List(of T)) As Boolean
        ...
    End Function

    Sub Main()
        Dim p As Predicate(Of List(Of Integer))
        p = AddressOf Compare(Of Integer)
    End Sub
End Module

Temsilci oluşturma ifadesinin bağımsız değişkeni bir lambda yöntemiyse, lambda yöntemi temsilci türünün imzasına uygulanabilir olmalıdır. Lambda yöntemi L , şu durumlarda temsilci türü D için geçerlidir:

  • Parametreleri varsa L , D aynı sayıda parametreye sahiptir. (Parametresi yoksayılır LD .)

  • Her birinin parametre türlerinin L , karşılık gelen parametre türünün türüne dönüştürmesi Dve değiştiricilerinin (örneğin ByRef, ByVal) eşleşmesi vardır.

  • bir işlevse D , dönüş türünün L dönüş türüne dönüştürmesi Dvardır. (Bir alt yordamsa D , dönüş değeri L yoksayılır.)

parametresinin L parametre türü atlanırsa, içindeki karşılık gelen parametrenin D türü çıkarılır; parametresinin L dizisi veya null atanabilir ad değiştiricileri varsa, derleme zamanı hata sonuçları elde edilir. Tüm parametre türleri L kullanılabilir olduğunda, lambda yöntemindeki ifadenin türü çıkarılır. Örneğin:

Delegate Function F(x As Integer, y As Long) As Long

Module Test
    Sub Main()
        ' b inferred to Integer, c and return type inferred to Long
        Dim a As F = Function(b, c) b + c

        ' e and return type inferred to Integer, f inferred to Long
        Dim d As F = Function(e, f) e + CInt(f)
    End Sub
End Module

Temsilci imzasının lambda yöntemi veya yöntem imzası ile tam olarak eşleşmediği bazı durumlarda, .NET Framework yerel olarak temsilci oluşturmayı desteklemeyebilir. Bu durumda, iki yöntemi eşleştirmek için bir lambda yöntemi ifadesi kullanılır. Örneğin:

Delegate Function IntFunc(x As Integer) As Integer

Module Test
    Function SquareString(x As String) As String
        Return CInt(x) * CInt(x)
    End Function 

    Sub Main()
        ' The following two lines are equivalent
        Dim a As New IntFunc(AddressOf SquareString)
        Dim b As New IntFunc( _
            Function(x As Integer) CInt(SquareString(CStr(x))))
    End Sub
End Module

Temsilci oluşturma ifadesinin sonucu, yöntem işaretçisi ifadesinden ilişkili hedef ifadeyle (varsa) eşleşen yönteme başvuran bir temsilci örneğidir. Hedef ifade bir değer türü olarak yazılırsa, bir temsilci yalnızca yığındaki bir nesnenin yöntemini işaret ettiğinden, değer türü sistem yığınına kopyalanır. Temsilcinin başvurduğu yöntem ve nesne, temsilcinin tüm ömrü boyunca sabit kalır. Başka bir deyişle, temsilci oluşturulduktan sonra temsilcinin hedefini veya nesnesini değiştirmek mümkün değildir.

Anonim Object-Creation İfadeleri

Üye başlatıcıları olan bir nesne oluşturma ifadesi de tür adını tamamen atlayabilir.

AnonymousObjectCreationExpression
    : 'New' ObjectMemberInitializer
    ;

Bu durumda, ifadenin bir parçası olarak başlatılan üyelerin türlerine ve adlarına göre anonim bir tür oluşturulur. Örneğin:

Module Test
    Sub Main()
        Dim Customer = New With { .Name = "John Smith", .Age = 34 }

        Console.WriteLine(Customer.Name)
    End Sub
End Module

Anonim nesne oluşturma ifadesi tarafından oluşturulan tür, adı olmayan, doğrudan öğesinden Objectdevralan ve üye başlatıcı listesinde atanan üyelerle aynı ada sahip bir özellik kümesine sahip olan bir sınıftır. Her özelliğin türü, yerel değişken türü çıkarımıyla aynı kurallar kullanılarak çıkarılır. Oluşturulan anonim türler de tüm üyelerin ve değerlerinin dize gösterimini döndürerek öğesini geçersiz kılar ToString. (Bu dizenin tam biçimi bu belirtim kapsamının dışındadır).

Varsayılan olarak, anonim tür tarafından oluşturulan özellikler okuma-yazmadır. Değiştiriciyi kullanarak anonim tür özelliğini salt okunur olarak işaretlemek Key mümkündür. Değiştirici, Key alanın anonim türün temsil ettiği değeri benzersiz olarak tanımlamak için kullanılabileceğini belirtir. Özelliği salt okunur hale getirmenin yanı sıra, anonim türün geçersiz kılıp EqualsGetHashCode arabirimini System.IEquatable(Of T) uygulamasına da neden olur (için Tanonim türü doldurma). Üyeler aşağıdaki gibi tanımlanır:

Function Equals(obj As Object) As Boolean ve Function Equals(val As T) As Boolean iki örneğin aynı türde olduğunu doğrulayarak ve kullanarak her Key üyeyi Object.Equalskarşılaştırarak uygulanır. Tüm Key üyeler eşitse, Equals döndürür True, aksi takdirde Equals döndürür False.

Function GetHashCode() As Integeranonim türün GetHashCode iki örneği için true ise Equals aynı değeri döndürecek şekilde uygulanır. Karma bir çekirdek değeriyle başlar ve ardından her Key üye için karma değeri 31 ile çarpar ve üye bir başvuru türü değilse veya değeri ile Nothingnull atanabilir değer türünde değilse, üyenin karma değerini (tarafından GetHashCodesağlanır) eklerKey.

Örneğin, deyiminde oluşturulan tür:

Dim zipState = New With { Key .ZipCode = 98112, .State = "WA" }

yaklaşık olarak şuna benzer bir sınıf oluşturur (tam uygulama farklılık gösterse de):

Friend NotInheritable Class $Anonymous1
    Implements IEquatable(Of $Anonymous1)

    Private ReadOnly _zipCode As Integer
    Private _state As String

    Public Sub New(zipCode As Integer, state As String)
        _zipCode = zipcode
        _state = state
    End Sub

    Public ReadOnly Property ZipCode As Integer
        Get
            Return _zipCode
        End Get
    End Property

    Public Property State As String
        Get
            Return _state
        End Get
        Set (value As Integer)
            _state = value
        End Set
    End Property

    Public Overrides Function Equals(obj As Object) As Boolean
        Dim val As $Anonymous1 = TryCast(obj, $Anonymous1)
        Return Equals(val)
    End Function

    Public Overloads Function Equals(val As $Anonymous1) As Boolean _
        Implements IEquatable(Of $Anonymous1).Equals

        If val Is Nothing Then 
            Return False
        End If

        If Not Object.Equals(_zipCode, val._zipCode) Then 
            Return False
        End If

        Return True
    End Function

    Public Overrides Function GetHashCode() As Integer
        Dim hash As Integer = 0

        hash = hash Xor _zipCode.GetHashCode()

        Return hash
    End Function

    Public Overrides Function ToString() As String
        Return "{ Key .ZipCode = " & _zipCode & ", .State = " & _state & " }"
    End Function
End Class

Anonim türün başka bir türdeki alanlardan oluşturulduğu durumu basitleştirmek için, aşağıdaki durumlarda alan adları doğrudan ifadelerden çıkarılabilir:

  • Basit bir ad ifadesi x adını xçıkarsar.

  • Üye erişim ifadesi x.y adını yçıkarsar.

  • Sözlük arama ifadesi x!y adını yçıkarsar.

  • Bağımsız değişken x() içermeyen bir çağrı veya dizin ifadesi adını xçıkarsar.

  • XML üyesi erişim ifadesi x.<y>, x...<y>, x.@y adını yçıkarsar.

  • Bir üye erişim ifadesinin hedefi olan XML üyesi erişim ifadesi x.<y>.z adını zçıkarsar.

  • Bağımsız değişken x.<y>.z() içermeyen bir çağırma veya dizin ifadesinin hedefi olan XML üyesi erişim ifadesi adını zçıkarsar.

  • Bir çağrı veya dizin ifadesinin hedefi olan XML üyesi erişim ifadesi x.<y>(0) adını yçıkarsar.

Başlatıcı, ifadenin çıkarılmış ada ataması olarak yorumlanır. Örneğin, aşağıdaki başlatıcılar eşdeğerdir:

Class Address
    Public Street As String
    Public City As String
    Public State As String
    Public ZIP As String
End Class

Class C1
    Sub Test(a As Address)
        Dim cityState1 = New With { .City = a.City, .State = a.State }
        Dim cityState2 = New With { a.City, a.State }
    End Sub
End Class

Türün GetHashCodemevcut bir üyesiyle çakışır bir üye adı çıkarsanırsa, derleme zamanı hatası oluşur. Normal üye başlatıcılarından farklı olarak, anonim nesne oluşturma ifadeleri üye başlatıcılarının döngüsel başvurulara sahip olmasına veya başlatılmadan önce üyeye başvurmasına izin vermez. Örneğin:

Module Test
    Sub Main()
        ' Error: Circular references
        Dim x = New With { .a = .b, .b = .a }

        ' Error: Referring to .b before it has been assigned to
        Dim y = New With { .a = .b, .b = 10 }

        ' Error: Referring to .a before it has been assigned to
        Dim z = New With { .a = .a }
    End Sub
End Module

Aynı yöntem içinde iki anonim sınıf oluşturma ifadesi oluşursa ve aynı sonuç şeklini verirse (özellik sırası, özellik adları ve özellik türlerinin tümü eşleşiyorsa) her ikisi de aynı anonim sınıfa başvurur. Başlatıcı ile bir örneğin veya paylaşılan üye değişkeninin yöntem kapsamı, değişkenin başlatıldığı oluşturucudur.

Not. Derleyici, derleme düzeyinde olduğu gibi anonim türleri daha fazla birleştirmeyi seçebilir, ancak şu anda buna güvenilemez.

Atama İfadeleri

Atama ifadesi, ifadeyi belirli bir türe zorlamalı olarak gösterir. Belirli tür dönüştürme anahtar sözcükleri, ifadeleri ilkel türlere zorlama. Bir ifadeyi bir türe zorlamak için , ve DirectCastolmak üzere üç genel atama anahtar sözcüğü. CTypeTryCast

CastExpression
    : 'DirectCast' OpenParenthesis Expression Comma TypeName CloseParenthesis
    | 'TryCast' OpenParenthesis Expression Comma TypeName CloseParenthesis
    | 'CType' OpenParenthesis Expression Comma TypeName CloseParenthesis
    | CastTarget OpenParenthesis Expression CloseParenthesis
    ;

CastTarget
    : 'CBool' | 'CByte' | 'CChar'  | 'CDate'  | 'CDec' | 'CDbl' | 'CInt'
    | 'CLng'  | 'CObj'  | 'CSByte' | 'CShort' | 'CSng' | 'CStr' | 'CUInt'
    | 'CULng' | 'CUShort'
    ;

DirectCast ve TryCast özel davranışları var. Bu nedenle yalnızca yerel dönüştürmeleri destekler. Ayrıca, bir TryCast ifadedeki hedef tür bir değer türü olamaz. Kullanıcı tanımlı dönüştürme işleçleri kullanıldığında veya TryCast kullanıldığında dikkate alınmazDirectCast. (Not. "Yerel CLR" dönüştürmeleri uyguladığından, bu ve TryCast desteğin kısıtlandığı dönüştürme kümesiDirectCast. AmacıDirectCast, "unbox" yönergesinin işlevselliğini sağlamak, amacı TryCast ise "isinst" yönergesinin işlevselliğini sağlamaktır. CLR yönergeleriyle eşlendiği için, CLR tarafından doğrudan desteklenmeyen dönüştürmeleri desteklemek amaçlanan amacı yener.)

DirectCastolarak yazılan ifadeleri değerinden CTypefarklı dönüştürürObject. Çalışma zamanı türü ilkel bir değer türü olan türdeki Object bir ifadeyi dönüştürürken, DirectCast belirtilen tür ifadenin çalışma zamanı türüyle aynı değilse veya ifade olarak değerlendirilirse Nothingbir System.NullReferenceException özel durum oluştururSystem.InvalidCastException. (Not. Yukarıda belirtildiği gibi, DirectCast ifadenin türü olduğunda doğrudan CLR yönergesi "unbox" ile eşler Object. Buna karşılık, CType ilkel türler arasındaki dönüştürmelerin desteklenmesi için dönüştürmeyi yapmak için çalışma zamanı yardımcısına yapılan bir çağrıya dönüşür. bir Object ifadenin ilkel bir değer türüne dönüştürülmesi ve gerçek örneğin türünün hedef türle eşleşmesi durumunda, DirectCast değerinden önemli ölçüde daha hızlı CTypeolacaktır.)

TryCast ifadeleri dönüştürür, ancak ifade hedef türe dönüştürülemiyorsa özel durum oluşturmaz. Bunun yerine, TryCast ifade çalışma zamanında dönüştürülemezse sonuçlanır Nothing . (Not. Yukarıda belirtildiği gibi, TryCast doğrudan "isinst" CLR yönergesine eşler. Tür denetimini ve dönüştürmeyi tek bir işlemde birleştirerek, TryCast ve sonra CTypebir TypeOf ... Is işlem yapmaktan daha ucuz olabilir.)

Örneğin:

Interface ITest
    Sub Test()
End Interface

Module Test
    Sub Convert(o As Object)
        Dim i As ITest = TryCast(o, ITest)

        If i IsNot Nothing Then
            i.Test()
        End If
    End Sub
End Module

İfadenin türünden belirtilen türe dönüştürme yoksa derleme zamanı hatası oluşur. Aksi takdirde, ifade bir değer olarak sınıflandırılır ve sonuç dönüştürme tarafından üretilen değerdir.

İşleç İfadeleri

İki tür işleç vardır. Birli işleçler bir işlenen alır ve ön ek gösterimini kullanır (örneğin, -x). İkili işleçler iki işlenen alır ve düzeltme gösterimini kullanır (örneğin, x + y). her zaman ile sonuçlanan Booleanilişkisel işleçler dışında, belirli bir tür için tanımlanan bir işleç bu türle sonuçlanır. bir işlecin işlenenleri her zaman bir değer olarak sınıflandırılmalıdır; işleç ifadesinin sonucu değer olarak sınıflandırılır.

OperatorExpression
    : ArithmeticOperatorExpression
    | RelationalOperatorExpression
    | LikeOperatorExpression
    | ConcatenationOperatorExpression
    | ShortCircuitLogicalOperatorExpression
    | LogicalOperatorExpression
    | ShiftOperatorExpression
    | AwaitOperatorExpression
    ;

İşleç Önceliği ve İlişkisellik

bir ifade birden çok ikili işleç içerdiğinde, işleçlerin önceliği , tek tek ikili işleçlerin değerlendirilme sırasını denetler. Örneğin, işlecin işleçten daha + yüksek önceliğe sahip olması nedeniyle * ifade x + y * z olarak x + (y * z) değerlendirilir. Aşağıdaki tabloda ikili işleçler azalan öncelik sırasına göre listelenmiştir:

Kategori Operatörler
Birincil tüm işleç olmayan ifadeler
Beklemek Await
Üs alma ^
Tekli olumsuzlama +, -
Çarpan *, /
Tamsayı bölme \
Modülü Mod
Katkı +, -
Birleştirme &
Vardiya <<, >>
İlişkisel =, <>, <, , >, <=, >=, Like, Is, IsNot
Mantıksal DEĞİl Not
Mantıksal VE And, AndAlso
Mantıksal VEYA Or, OrElse
Mantıksal XOR Xor

bir ifade aynı önceliğe sahip iki işleç içerdiğinde, işleçlerin ilişkilendirilmesi işlemlerin hangi sırada gerçekleştirildiğini denetler. Tüm ikili işleçler sola ilişkilendirilir, yani işlemler soldan sağa gerçekleştirilir. Öncelik ve ilişkisellik parantezsel ifadeler kullanılarak denetlenebilir.

Nesne İşlenenleri

Her işleç tarafından desteklenen normal türlere ek olarak, tüm işleçler türünde Objectişlenenleri destekler. İşlenenlere Object uygulanan işleçler, değerler üzerinde Object yapılan yöntem çağrılarına benzer şekilde işlenir: geç bağlanan bir yöntem çağrısı seçilebilir; bu durumda derleme zamanı türü yerine işlenenlerin çalışma zamanı türü işlemin geçerliliğini ve türünü belirler. Katı semantikler derleme ortamı veya tarafından Option Strictbelirtilirse, türü Object işlenenleri olan tüm işleçler, ve IsNot işleçleri dışında derleme zamanı hatasına TypeOf...IsIs neden olur.

İşleç çözümlemesi bir işlemin geç bağlı olarak gerçekleştirilmesi gerektiğini belirlediğinde, işlenenlerin çalışma zamanı türleri işleç tarafından desteklenen türlerse, işlemin sonucu işlecini işlenen türlerine uygulamanın sonucudur. Değer Nothing , ikili işleç ifadesindeki diğer işlenenin türünün varsayılan değeri olarak kabul edilir. Birli işleç ifadesinde veya her iki işlenen Nothing de ikili işleç ifadesindeyse, işleç ile sonuçlanmazsaInteger, işlemin Integer türü veya işlecin tek sonuç türüdür. İşlemin sonucu her zaman öğesine geri döndürülecek Object. İşlenen türlerinin geçerli bir işleci yoksa, bir System.InvalidCastException özel durum oluşturulur. Çalışma zamanında dönüştürmeler örtük veya açık olup olmadıklarına bakılmaksızın yapılır.

Sayısal ikili işlemin sonucu bir taşma özel durumu oluşturursa (tamsayı taşması denetiminin açık veya kapalı olmasına bakılmaksızın), sonuç türü mümkünse sonraki daha geniş sayısal türe yükseltilir. Örneğin, aşağıdaki kodu göz önünde bulundurun:

Module Test
    Sub Main()
        Dim o As Object = CObj(CByte(2)) * CObj(CByte(255))

        Console.WriteLine(o.GetType().ToString() & " = " & o)
    End Sub
End Module

Aşağıdaki sonucu yazdırır:

System.Int16 = 512

Sayıyı tutmak için daha geniş bir sayısal tür yoksa, bir System.OverflowException özel durum oluşturulur.

İşleç Çözünürlüğü

bir işleç türü ve işlenen kümesi verüldüğünde, işleç çözünürlüğü işlenenler için kullanılacak işleci belirler. İşleçler çözümlenirken, aşağıdaki adımlar kullanılarak önce kullanıcı tanımlı işleçler dikkate alınır:

  1. İlk olarak, tüm aday işleçler toplanır. Aday işleçleri, kaynak türdeki belirli işleç türünün kullanıcı tanımlı işleçlerinin ve hedef türdeki belirli türün kullanıcı tanımlı işleçlerinin tümüdür. Kaynak türü ve hedef türü ilişkiliyse, ortak işleçler yalnızca bir kez değerlendirilir.

  2. Ardından, işleçlere ve işlenenlere en belirli işleci seçmek için aşırı yükleme çözümlemesi uygulanır. İkili işleçler söz konusu olduğunda, bu durum geç bağlanan bir çağrıya neden olabilir.

Bir türü T?için aday işleçleri toplanırken türündeki işleçler T kullanılır. Yalnızca null değer türlerini içeren kullanıcı tanımlı işleçlerden herhangi biri Tde kaldırılır. Kaldırılan işleç, ve IsFalse dönüş türleri (olmalıdırBoolean) dışında herhangi bir değer türünün IsTrue null atanabilir sürümünü kullanır. Kaldırılan işleçler, işlenenler null atanamaz sürümlerine dönüştürülerek, kullanıcı tanımlı işleç değerlendirilerek ve ardından sonuç türü null atanabilir sürümüne dönüştürülerek değerlendirilir. Ether işleneni ise Nothing, ifadenin sonucu, sonuç türünün null atanabilir sürümü olarak yazılan bir değerdir Nothing . Örneğin:

Structure T
    ...
End Structure

Structure S
    Public Shared Operator +(ByVal op1 As S, ByVal op2 As T) As T
        ...
    End Operator
End Structure

Module Test
    Sub Main()
        Dim x As S?
        Dim y, z As T?

        ' Valid, as S + T = T is lifted to S? + T? = T?
        z = x + y 
    End Sub
End Module

İşleç bir ikili işleç ve işlenenlerden biri başvuru türü ise, işleç de kaldırılır, ancak işleç bağlaması bir hata oluşturur. Örneğin:

Structure S1
    Public F1 As Integer

    Public Shared Operator +(left As S1, right As String) As S1
       ...
    End Operator
End Structure

Module Test
    Sub Main()
        Dim a? As S1
        Dim s As String
        
        ' Error: '+' is not defined for S1? and String
        a = a + s
    End Sub
End Module

Not. Bu kural, gelecek bir sürümde null yayma başvuru türleri eklemek isteyip istemediğiniz konusunda dikkate alınması nedeniyle mevcuttur. Bu durumda, iki tür arasındaki ikili işleçler söz konusu olduğunda davranış değişir.

Dönüştürmelerde olduğu gibi, kullanıcı tanımlı işleçler her zaman kaldırılan işleçler yerine tercih edilir.

Aşırı yüklenmiş işleçler çözümlendiğinde, Visual Basic'te tanımlanan sınıflarla diğer dillerde tanımlanan sınıflar arasında farklar olabilir:

  • Diğer dillerde, Not, Andve Or hem mantıksal işleçler hem de bit düzeyinde işleçler olarak aşırı yüklenebilir. Dış derlemeden içeri aktarıldıktan sonra, her iki form da bu işleçler için geçerli bir aşırı yükleme olarak kabul edilir. Ancak, hem mantıksal hem de bit düzeyinde işleçleri tanımlayan bir tür için yalnızca bit tabanlı uygulama dikkate alınır.

  • Diğer dillerde >> ve << hem imzalı işleçler hem de imzasız işleçler olarak aşırı yüklenebilir. Dış derlemeden içeri aktarıldıktan sonra, her iki form da geçerli bir aşırı yükleme olarak kabul edilir. Ancak hem imzalı hem de imzasız işleçleri tanımlayan bir tür için yalnızca imzalı uygulama dikkate alınır.

  • İşlenenlere en özel kullanıcı tanımlı işleç yoksa, iç işleçler dikkate alınır. İşlenenler için hiçbir iç işleç tanımlanmamışsa ve işlenenlerden herhangi biri Object türüne sahipse işleç geç bağlı olarak çözümlenir; aksi takdirde derleme zamanı hatası oluşur.

Visual Basic'in önceki sürümlerinde Object türünde tam olarak bir işlenen varsa ve geçerli kullanıcı tanımlı işleçler yoksa ve geçerli iç işleçler yoksa, bu bir hataydı. Visual Basic 11 itibarıyla artık geç bağlanmış olarak çözümlenir. Örneğin:

Module Module1
  Sub Main()
      Dim p As Object = Nothing
      Dim U As New Uri("http://www.microsoft.com")
      Dim j = U * p  ' is now resolved late-bound
   End Sub
End Module

İç işleci olan bir tür T de için T?aynı işleci tanımlar. üzerinde T? işlecinin sonucu ile Taynıdır, ancak işlenenlerden biri Nothingise işlecin Nothing sonucu olur (null değer yayılır). bir işlemin türünü çözümlemek amacıyla, ? bu işlem içeren işlenenlerden kaldırılır, işlemin türü belirlenir ve işlenenlerden herhangi biri null değer türleriyse işlemin türüne bir ? eklenir. Örneğin:

Dim v1? As Integer = 10
Dim v2 As Long = 20

' Type of operation will be Long?
Console.WriteLine(v1 + v2)

Her işleç, tanımlandığı iç türleri ve işlenen türleri dikkate alındığında gerçekleştirilen işlemin türünü listeler. İç işlem türünün sonucu şu genel kuralları izler:

  • Tüm işlenenler aynı türdeyse ve işleç türü için tanımlanmışsa, dönüştürme gerçekleşmez ve bu türün işleci kullanılır.

  • İşleç için türü tanımlanmayan herhangi bir işlenen aşağıdaki adımlar kullanılarak dönüştürülür ve işleç yeni türlerde çözümlenir:

    • İşlenen, hem işleç hem de işlenen için tanımlanan ve örtük olarak dönüştürülebilir olduğu bir sonraki en geniş türe dönüştürülür.

    • Böyle bir tür yoksa, işlenen hem işleç hem de işlenen için tanımlanan ve örtük olarak dönüştürülebilir olduğu bir sonraki en dar türe dönüştürülür.

    • Böyle bir tür yoksa veya dönüştürme gerçekleşemiyorsa derleme zamanı hatası oluşur.

  • Aksi takdirde işlenenler daha geniş işlenen türlerine dönüştürülür ve bu türün işleci kullanılır. Daha dar işlenen türü örtük olarak daha geniş işleç türüne dönüştürülemiyorsa derleme zamanı hatası oluşur.

Ancak bu genel kurallara rağmen, işleç sonuçları tablolarında dikkate alınan bir dizi özel durum vardır.

Not. Biçimlendirme nedeniyle, işleç türündeki tablolar önceden tanımlanmış adları ilk iki karakterle kısaltılır. Bu nedenle "By" Byte, "UI" , UInteger"St" , vb. olur String. "Err", belirtilen işlenen türleri için tanımlanmış bir işlem olmadığı anlamına gelir.

Aritmetik İşleçler

*, , /, \, ^, Mod, +ve - işleçleri aritmetik işleçlerdir.

ArithmeticOperatorExpression
    : UnaryPlusExpression
    | UnaryMinusExpression
    | AdditionOperatorExpression
    | SubtractionOperatorExpression
    | MultiplicationOperatorExpression
    | DivisionOperatorExpression
    | ModuloOperatorExpression
    | ExponentOperatorExpression
    ;

Kayan nokta aritmetik işlemleri, işlemin sonuç türünden daha yüksek hassasiyetle gerçekleştirilebilir. Örneğin, bazı donanım mimarileri türünden daha büyük aralık ve duyarlık ile "genişletilmiş" veya "uzun çift" kayan Double nokta türünü destekler ve bu daha yüksek duyarlıklı türü kullanarak tüm kayan nokta işlemlerini örtük olarak gerçekleştirir. Donanım mimarileri, kayan nokta işlemlerini yalnızca performans açısından aşırı maliyetle daha az hassasiyetle gerçekleştirmek için yapılabilir; Visual Basic, bir uygulamanın hem performans hem de duyarlık kaybına neden olmasını gerektirmek yerine, tüm kayan nokta işlemleri için daha yüksek duyarlıklı türün kullanılmasına olanak tanır. Daha kesin sonuçlar sunmanın dışında, bu nadiren ölçülebilir etkilere sahiptir. Ancak, çarpımın aralığın dışında Double bir sonuç ürettiği, ancak sonraki bölmenin geçici sonucu aralığa geri Double getirdiği form x * y / zifadelerinde, ifadenin daha yüksek aralıklı bir biçimde değerlendirildiği gerçeği sonsuzluk yerine sonlu bir sonucun üretilmesine neden olabilir.

Birli Artı İşleci

UnaryPlusExpression
    : '+' Expression
    ;

Birli artı işleci , , , , , Short, UInteger, Integer, , ULong, LongDoubleSingleve Decimal türleri için Bytetanımlanır. UShortSByte

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Sh SB Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob

Birli Eksi İşleci

UnaryMinusExpression
    : '-' Expression
    ;

Birli eksi işleci aşağıdaki türler için tanımlanır:

SByte, , Short, Integer ve Long. Sonuç, işlenen sıfırdan çıkarılarak hesaplanır. Tamsayı taşması denetimi açıksa ve işlenenin değeri en büyük negatif SByte, Short, Integerveya Longise bir System.OverflowException özel durum oluşturulur. Aksi takdirde, işlenenin değeri en büyük negatif SByte, Short, Integerveya Longise, sonuç aynı değerdir ve taşma bildirılmaz.

Single ve Double. Sonuç, 0 ve Infinity değerleri dahil olmak üzere, işareti ters çevrilmiş işlenenin değeridir. İşlenen NaN ise, sonuç da NaN olur.

Decimal. Sonuç, işlenen sıfırdan çıkarılarak hesaplanır.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Sh SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob

Toplama İşleci

Toplama işleci, iki işlenenin toplamını hesaplar.

AdditionOperatorExpression
    : Expression '+' LineTerminator? Expression
    ;

Ekleme işleci aşağıdaki türler için tanımlanır:

  • Byte, SByte, UShort, Short, UInteger, Integer, ULong ve Long. Tamsayı taşması denetimi açıksa ve toplam sonuç türü aralığının dışındaysa, bir System.OverflowException özel durum oluşturulur. Aksi takdirde taşmalar raporlanmaz ve sonucun önemli yüksek sıralı bitleri atılır.

  • Single ve Double. Toplam, IEEE 754 aritmetik kurallarına göre hesaplanır.

  • Decimal. Sonuçta elde edilen değer ondalık biçimde temsil etmek için çok büyükse, bir System.OverflowException özel durum oluşturulur. Sonuç değeri ondalık biçimde temsil etmek için çok küçükse, sonuç 0 olur.

  • String. İki String işlenen birlikte birleştirilir.

  • Date. türü System.DateTime aşırı yüklenmiş toplama işleçlerini tanımlar. İç System.DateTime türe eşdeğer olduğundan, bu işleçler Date türü üzerinde Date de kullanılabilir.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Sh SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
SB SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
Tarafından Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
ABD ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İçinde In İşte İşte De De Si Yap! Hata Hata Yap! Ob
kullanıcı arabirimi Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İşte İşte De De Si Yap! Hata Hata Yap! Ob
UL UL De Si Yap! Hata Hata Yap! Ob
De De Si Yap! Hata Hata Yap! Ob
Si Si Yap! Hata Hata Yap! Ob
Yapmak Yap! Hata Hata Yap! Ob
Da St Hata St Ob
Caner St St Ob
St St Ob
Ob Ob

Çıkarma İşleci

Çıkarma işleci, ikinci işleneni ilk işlenenden çıkarır.

SubtractionOperatorExpression
    : Expression '-' LineTerminator? Expression
    ;

Çıkarma işleci aşağıdaki türler için tanımlanır:

  • Byte, SByte, UShort, Short, UInteger, Integer, ULong ve Long. Tamsayı taşması denetimi açıksa ve fark sonuç türü aralığının dışındaysa, bir System.OverflowException özel durum oluşturulur. Aksi takdirde taşmalar raporlanmaz ve sonucun önemli yüksek sıralı bitleri atılır.

  • Single ve Double. Fark, IEEE 754 aritmetik kurallarına göre hesaplanır.

  • Decimal. Sonuçta elde edilen değer ondalık biçimde temsil etmek için çok büyükse, bir System.OverflowException özel durum oluşturulur. Sonuç değeri ondalık biçimde temsil etmek için çok küçükse, sonuç 0 olur.

  • Date. türü System.DateTime aşırı yüklenmiş çıkarma işleçlerini tanımlar. İç System.DateTime türe eşdeğer olduğundan, bu işleçler Date türü üzerinde Date de kullanılabilir.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Sh SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
SB SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
Tarafından Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
ABD ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İçinde In İşte İşte De De Si Yap! Hata Hata Yap! Ob
kullanıcı arabirimi Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İşte İşte De De Si Yap! Hata Hata Yap! Ob
UL UL De Si Yap! Hata Hata Yap! Ob
De De Si Yap! Hata Hata Yap! Ob
Si Si Yap! Hata Hata Yap! Ob
Yapmak Yap! Hata Hata Yap! Ob
Da Hata Hata Hata Hata
Caner Hata Hata Hata
St Yap! Ob
Ob Ob

Çarpma İşleci

Çarpma işleci, iki işlenenin çarpımını hesaplar.

MultiplicationOperatorExpression
    : Expression '*' LineTerminator? Expression
    ;

Çarpma işleci aşağıdaki türler için tanımlanır:

  • Byte, SByte, UShort, Short, UInteger, Integer, ULong ve Long. Tamsayı taşması denetimi açıksa ve ürün sonuç türü aralığının dışındaysa bir System.OverflowException özel durum oluşur. Aksi takdirde taşmalar raporlanmaz ve sonucun önemli yüksek sıralı bitleri atılır.

  • Single ve Double. Ürün, IEEE 754 aritmetik kurallarına göre hesaplanır.

  • Decimal. Sonuçta elde edilen değer ondalık biçimde temsil etmek için çok büyükse, bir System.OverflowException özel durum oluşturulur. Sonuç değeri ondalık biçimde temsil etmek için çok küçükse, sonuç 0 olur.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Sh SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
SB SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
Tarafından Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
ABD ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İçinde In İşte İşte De De Si Yap! Hata Hata Yap! Ob
kullanıcı arabirimi Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İşte İşte De De Si Yap! Hata Hata Yap! Ob
UL UL De Si Yap! Hata Hata Yap! Ob
De De Si Yap! Hata Hata Yap! Ob
Si Si Yap! Hata Hata Yap! Ob
Yapmak Yap! Hata Hata Yap! Ob
Da Hata Hata Hata Hata
Caner Hata Hata Hata
St Yap! Ob
Ob Ob

Bölme İşleçleri

Bölme işleçleri iki işlenenin bölümünü hesaplar. İki bölme işleci vardır: normal (kayan nokta) bölme işleci ve tamsayı bölme işleci.

DivisionOperatorExpression
    : FPDivisionOperatorExpression
    | IntegerDivisionOperatorExpression
    ;

FPDivisionOperatorExpression
    : Expression '/' LineTerminator? Expression
    ;

IntegerDivisionOperatorExpression
    : Expression '\\' LineTerminator? Expression
    ;

Normal bölme işleci aşağıdaki türler için tanımlanır:

  • Single ve Double. Bölüm, IEEE 754 aritmetik kurallarına göre hesaplanır.

  • Decimal. Doğru işlenenin değeri sıfırsa, bir System.DivideByZeroException özel durum oluşturulur. Sonuçta elde edilen değer ondalık biçimde temsil etmek için çok büyükse, bir System.OverflowException özel durum oluşturulur. Sonuç değeri ondalık biçimde temsil etmek için çok küçükse, sonuç sıfır olur. Herhangi bir yuvarlamadan önce sonucun ölçeği, tercih edilen ölçeğe en yakın ölçektir ve sonucu tam sonucla eşit şekilde korur. Tercih edilen ölçek, ikinci işlenenin ölçeğini azaltan ilk işlenenin ölçeğidir.

Normal işleç çözümleme kurallarına göre, normal bölme yalnızca , ve gibi Bytetürlerdeki işlenenler arasında bölünür ve Long her iki işlenenin türüne Decimaldönüştürülmesini Integersağlar. Short Ancak, türlerden hiçbiri olmadığında bölme işlecinde işleç çözümlemesi Decimalyapılırken , Double değerinden Decimaldaha dar kabul edilir. Bölme, bölmeden Decimal daha verimli olduğundan Double bu kurala uyulur.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! De Si Yap! Hata Hata Yap! Ob
SB Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! De Si Yap! Hata Hata Yap! Ob
Tarafından Yap! Yap! Yap! Yap! Yap! Yap! Yap! De Si Yap! Hata Hata Yap! Ob
Sh Yap! Yap! Yap! Yap! Yap! Yap! De Si Yap! Hata Hata Yap! Ob
ABD Yap! Yap! Yap! Yap! Yap! De Si Yap! Hata Hata Yap! Ob
İçinde Yap! Yap! Yap! Yap! De Si Yap! Hata Hata Yap! Ob
kullanıcı arabirimi Yap! Yap! Yap! De Si Yap! Hata Hata Yap! Ob
İşte Yap! Yap! De Si Yap! Hata Hata Yap! Ob
UL Yap! De Si Yap! Hata Hata Yap! Ob
De De Si Yap! Hata Hata Yap! Ob
Si Si Yap! Hata Hata Yap! Ob
Yapmak Yap! Hata Hata Yap! Ob
Da Hata Hata Hata Hata
Caner Hata Hata Hata
St Yap! Ob
Ob Ob

Tamsayı bölme işleci , , SByteUShort, , Short, UInteger, IntegerULongve Longiçin Bytetanımlanır. Doğru işlenenin değeri sıfırsa, bir System.DivideByZeroException özel durum oluşturulur. Bölme sonucu sıfıra yuvarlar ve sonucun mutlak değeri, iki işlenenin bölümünün mutlak değerinden küçük olan mümkün olan en büyük tamsayıdır. sonuç, iki işlenen aynı işarete sahip olduğunda sıfır veya pozitif, iki işlenen karşıt işaretlere sahip olduğunda sıfır veya negatiftir. Sol işlenen en büyük negatif , , veya Longise ve sağ işlenen ise -1bir taşma oluşur; tamsayı taşması denetimi açıksa bir System.OverflowException özel durum Integeroluşur. ShortSByte Aksi takdirde taşma bildirilir ve sonuç bunun yerine sol işlenenin değeri olur.

Not. İmzasız türlerin iki işleneni her zaman sıfır veya pozitif olacağı için sonuç her zaman sıfır veya pozitif olur. İfadenin sonucu her zaman iki işlenenin en büyüğüne eşit veya daha küçük olacağı için taşma gerçekleşmeyebilir. Bu nedenle, iki işaretsiz tamsayı ile tamsayı bölme için tamsayı taşması denetimi gerçekleştirilmez. Sonuç, sol işlenenin türüdür.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Sh SB Sh Sh In In İşte İşte İşte İşte İşte İşte Hata Hata İşte Ob
SB SB Sh Sh In In İşte İşte İşte İşte İşte İşte Hata Hata İşte Ob
Tarafından Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL İşte İşte İşte Hata Hata İşte Ob
Sh Sh In In İşte İşte İşte İşte İşte İşte Hata Hata İşte Ob
ABD ABD In Kullanıcı Arayüzü (UI) İşte UL İşte İşte İşte Hata Hata İşte Ob
İçinde In İşte İşte İşte İşte İşte İşte Hata Hata İşte Ob
kullanıcı arabirimi Kullanıcı Arayüzü (UI) İşte UL İşte İşte İşte Hata Hata İşte Ob
İşte İşte İşte İşte İşte İşte Hata Hata İşte Ob
UL UL İşte İşte İşte Hata Hata İşte Ob
De İşte İşte İşte Hata Hata İşte Ob
Si İşte İşte Hata Hata İşte Ob
Yapmak İşte Hata Hata İşte Ob
Da Hata Hata Hata Hata
Caner Hata Hata Hata
St İşte Ob
Ob Ob

Mod İşleci

Mod (modulo) işleci, iki işlenen arasındaki bölmenin geri kalanını hesaplar.

ModuloOperatorExpression
    : Expression 'Mod' LineTerminator? Expression
    ;

işleci Mod aşağıdaki türler için tanımlanır:

  • Byte, , UShortSByte, Short, UInteger, , ULongIntegerve Long. x Mod y sonucu, x - (x \ y) * ytarafından üretilen değerdir. Sıfır ise y , bir System.DivideByZeroException özel durum oluşturulur. Modulo işleci hiçbir zaman taşmalara neden olmaz.

  • Single ve Double. Kalan değer, IEEE 754 aritmetik kurallarına göre hesaplanır.

  • Decimal. Doğru işlenenin değeri sıfırsa, bir System.DivideByZeroException özel durum oluşturulur. Sonuçta elde edilen değer ondalık biçimde temsil etmek için çok büyükse, bir System.OverflowException özel durum oluşturulur. Sonuç değeri ondalık biçimde temsil etmek için çok küçükse, sonuç sıfır olur.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Sh SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
SB SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
Tarafından Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
ABD ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İçinde In İşte İşte De De Si Yap! Hata Hata Yap! Ob
kullanıcı arabirimi Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İşte İşte De De Si Yap! Hata Hata Yap! Ob
UL UL De Si Yap! Hata Hata Yap! Ob
De De Si Yap! Hata Hata Yap! Ob
Si Si Yap! Hata Hata Yap! Ob
Yapmak Yap! Hata Hata Yap! Ob
Da Hata Hata Hata Hata
Caner Hata Hata Hata
St Yap! Ob
Ob Ob

Üs İşleci

Üs işleci, ikinci işlenenin gücüne yükseltilen ilk işleneni hesaplar.

ExponentOperatorExpression
    : Expression '^' LineTerminator? Expression
    ;

Üs işleci türü Doubleiçin tanımlanır. Değer, IEEE 754 aritmetik kurallarına göre hesaplanır.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Hata Hata Yap! Ob
SB Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Hata Hata Yap! Ob
Tarafından Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Hata Hata Yap! Ob
Sh Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Hata Hata Yap! Ob
ABD Yap! Yap! Yap! Yap! Yap! Yap! Yap! Yap! Hata Hata Yap! Ob
İçinde Yap! Yap! Yap! Yap! Yap! Yap! Yap! Hata Hata Yap! Ob
kullanıcı arabirimi Yap! Yap! Yap! Yap! Yap! Yap! Hata Hata Yap! Ob
İşte Yap! Yap! Yap! Yap! Yap! Hata Hata Yap! Ob
UL Yap! Yap! Yap! Yap! Hata Hata Yap! Ob
De Yap! Yap! Yap! Hata Hata Yap! Ob
Si Yap! Yap! Hata Hata Yap! Ob
Yapmak Yap! Hata Hata Yap! Ob
Da Hata Hata Hata Hata
Caner Hata Hata Hata
St Yap! Ob
Ob Ob

İlişkisel İşleçler

İlişkisel işleçler değerleri birbiriyle karşılaştırır. Karşılaştırma işleçleri , <>, <, >, <=ve >=şeklindedir=.

RelationalOperatorExpression
    : Expression '=' LineTerminator? Expression
    | Expression '<' '>' LineTerminator? Expression
    | Expression '<' LineTerminator? Expression
    | Expression '>' LineTerminator? Expression
    | Expression '<' '=' LineTerminator? Expression
    | Expression '>' '=' LineTerminator? Expression
    ;

İlişkisel işleçlerin tümü bir Boolean değerle sonuçlanır.

İlişkisel işleçler şu genel anlama sahiptir:

  • işleci, = iki işlenenin eşit olup olmadığını test eder.

  • işleci, <> iki işlenenin eşit olup olmadığını test eder.

  • işleci, < ilk işlenenin ikinci işlenenden küçük olup olmadığını sınar.

  • işleci, > ilk işlenenin ikinci işlenenden büyük olup olmadığını sınar.

  • işleci, <= ilk işlenenin ikinci işlenenden küçük veya buna eşit olup olmadığını sınar.

  • işleci, >= ilk işlenenin ikinci işlenenden büyük mü yoksa ikinci işlenene eşit mi olduğunu sınar.

İlişkisel işleçler aşağıdaki türler için tanımlanır:

  • Boolean. İşleçler iki işlenenin doğruluk değerlerini karşılaştırır. True , sayısal değerleriyle eşleşen değerinden küçük Falseolarak kabul edilir.

  • Byte, SByte, UShort, Short, UInteger, Integer, ULong ve Long. İşleçler, iki tamsayı işleneninin sayısal değerlerini karşılaştırır.

  • Single ve Double. İşleçler işlenenleri IEEE 754 standardının kurallarına göre karşılaştırır.

  • Decimal. İşleçler, iki ondalık işlenenin sayısal değerlerini karşılaştırır.

  • Date. İşleçler, iki tarih/saat değerini karşılaştırmanın sonucunu döndürür.

  • Char. İşleçler, iki Unicode değerini karşılaştırmanın sonucunu döndürür.

  • String. İşleçler, ikili karşılaştırma veya metin karşılaştırması kullanarak iki değeri karşılaştırmanın sonucunu döndürür. Kullanılan karşılaştırma derleme ortamı ve Option Compare deyimi tarafından belirlenir. İkili karşılaştırma, her dizedeki her karakterin sayısal Unicode değerinin aynı olup olmadığını belirler. Metin karşılaştırması, .NET Framework'te kullanılan geçerli kültüre göre Unicode metin karşılaştırması yapar. Dize karşılaştırması yaparken null değer dize değişmez ""değerine eşdeğerdir.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Bo SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Bo Ob
SB SB Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
Tarafından Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
Sh Sh In In İşte İşte De De Si Yap! Hata Hata Yap! Ob
ABD ABD In Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İçinde In İşte İşte De De Si Yap! Hata Hata Yap! Ob
kullanıcı arabirimi Kullanıcı Arayüzü (UI) İşte UL De Si Yap! Hata Hata Yap! Ob
İşte İşte De De Si Yap! Hata Hata Yap! Ob
UL UL De Si Yap! Hata Hata Yap! Ob
De De Si Yap! Hata Hata Yap! Ob
Si Si Yap! Hata Hata Yap! Ob
Yapmak Yap! Hata Hata Yap! Ob
Da Da Hata Da Ob
Caner Caner St Ob
St St Ob
Ob Ob

Like İşleci

işleci Like , bir dizenin belirli bir desenle eşleşip eşleşmediğini belirler.

LikeOperatorExpression
    : Expression 'Like' LineTerminator? Expression
    ;

işleci Like türü için String tanımlanır. İlk işlenen eşleştirilen dizedir ve ikinci işlenen de eşleştirilen desendir. Desen Unicode karakterlerinden oluşur. Aşağıdaki karakter dizilerinin özel anlamları vardır:

  • Karakter ? herhangi bir tek karakterle eşleşir.

  • Karakter * sıfır veya daha fazla karakterle eşleşir.

  • Karakter # herhangi bir tek basamakla (0-9) eşleşir.

  • Köşeli ayraç ([ab...]) ile çevrili karakterlerin listesi, listedeki tek bir karakterle eşleşir.

  • Köşeli ayraçlarla çevrelenmiş ve ünlem işareti ([!ab...]) ön ekli karakterlerin listesi, karakter listesinde bulunmayan tek bir karakterle eşleşir.

  • Karakter listesindeki iki karakter, kısa çizgiyle (-) ayrılmış olarak, ilk karakterden başlayıp ikinci karakterle biten unicode karakter aralığını belirtir. İkinci karakter sıralama düzeninde ilk karakterden daha sonra değilse, bir çalışma zamanı özel durumu oluşur. Karakter listesinin başında veya sonunda görünen kısa çizgi kendisini belirtir.

Sol köşeli ayraç (), soru işareti ([?), sayı işareti (#) ve yıldız işareti ()* ile eşleştirmek için köşeli ayraçların bunları içine alması gerekir. Sağ köşeli ayraç (]) bir grubun içinde kendi kendine eşleşecek şekilde kullanılamaz, ancak grubun dışında tek bir karakter olarak kullanılabilir. Karakter dizisi [] , dize değişmez değeri ""olarak kabul edilir.

Karakter listeleri için karakter karşılaştırmalarının ve sıralamanın, kullanılan karşılaştırmaların türüne bağlı olduğunu unutmayın. İkili karşılaştırmalar kullanılıyorsa, karakter karşılaştırmaları ve sıralama sayısal Unicode değerlerini temel alır. Metin karşılaştırmaları kullanılıyorsa, karakter karşılaştırmaları ve sıralama, .NET Framework'te kullanılan geçerli yerel ayarı temel alır.

Bazı dillerde, alfabedeki özel karakterler iki ayrı karakteri temsil eder ve tam tersi de geçerlidir. Örneğin, çeşitli diller karakterleri ae temsil etmek için ve æ birlikte ^ göründükleri zaman karakterlerini kullanırken ve O karakterini Ôtemsil etmek için kullanılabilir. Operatör, metin karşılaştırmalarını kullanırken bu Like tür kültürel denklikleri tanır. Bu durumda, desen veya dizedeki tek bir özel karakterin oluşumu, diğer dizedeki eşdeğer iki karakterlik diziyle eşleşir. Benzer şekilde, köşeli ayraç içine alınmış desendeki tek bir özel karakter (tek başına, listede veya aralıkta) dizedeki eşdeğer iki karakterli diziyle eşleşir ve tam tersi de geçerlidir.

Like her iki işlenenin Nothing de olduğu veya bir işlenenin öğesine iç dönüştürmesi String olduğu ve diğer işlenenin ise NothingNothing olduğu bir ifadede, boş dize değişmez değeriymiş ""gibi kabul edilir.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo St St St St St St St St St St St St St St St Ob
SB St St St St St St St St St St St St St St Ob
Tarafından St St St St St St St St St St St St St Ob
Sh St St St St St St St St St St St St Ob
ABD St St St St St St St St St St St Ob
İçinde St St St St St St St St St St Ob
kullanıcı arabirimi St St St St St St St St St Ob
İşte St St St St St St St St Ob
UL St St St St St St St Ob
De St St St St St St Ob
Si St St St St St Ob
Yapmak St St St St Ob
Da St St St Ob
Caner St St Ob
St St Ob
Ob Ob

Birleştirme İşleci

ConcatenationOperatorExpression
    : Expression '&' LineTerminator? Expression
    ;

Birleştirme işleci, iç değer türlerinin null atanabilir sürümleri de dahil olmak üzere tüm iç türler için tanımlanır. Ayrıca, yukarıda bahsedilen ve System.DBNulldize olarak Nothing ele alınan türler arasında birleştirme için de tanımlanır. Birleştirme işleci tüm işlenenlerini Stringöğesine dönüştürür; ifadede, katı semantiğin kullanılıp kullanılmadığına bakılmaksızın tüm dönüştürmelerin String genişletilme olarak kabul edilir. Bir System.DBNull değer olarak Stringyazılan değişmez değere Nothing dönüştürülür. Değeri, çalışma zamanı hatası oluşturmak yerine olarak Stringsabit değer türüne Nothing dönüştürülen null atanabilir bir değer Nothing türü.

Birleştirme işlemi, iki işlenenin soldan sağa doğru sırasıyla birleştirilmiş bir dizeyle sonuçlanır. Değer Nothing , boş dize değişmez değeriymiş ""gibi değerlendirilir.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo St St St St St St St St St St St St St St St Ob
SB St St St St St St St St St St St St St St Ob
Tarafından St St St St St St St St St St St St St Ob
Sh St St St St St St St St St St St St Ob
ABD St St St St St St St St St St St Ob
İçinde St St St St St St St St St St Ob
kullanıcı arabirimi St St St St St St St St St Ob
İşte St St St St St St St St Ob
UL St St St St St St St Ob
De St St St St St St Ob
Si St St St St St Ob
Yapmak St St St St Ob
Da St St St Ob
Caner St St Ob
St St Ob
Ob Ob

Mantıksal İşleçler

And, Not, Orve Xor işleçleri mantıksal işleçler olarak adlandırılır.

LogicalOperatorExpression
    : 'Not' Expression
    | Expression 'And' LineTerminator? Expression
    | Expression 'Or' LineTerminator? Expression
    | Expression 'Xor' LineTerminator? Expression
    ;

Mantıksal işleçler aşağıdaki gibi değerlendirilir:

  • Türü için Boolean :

    • Mantıksal And işlem, iki işleneni üzerinde gerçekleştirilir.

    • Mantıksal Not işlem işleneninde gerçekleştirilir.

    • Mantıksal Or işlem, iki işleneni üzerinde gerçekleştirilir.

    • Mantıksal bir özel kullanım işlemiOr , iki işlenen üzerinde gerçekleştirilir.

  • , , SByte, UShort, Short, UInteger, Integer, , LongULongve tüm numaralandırılmış türler içinByte, belirtilen işlem iki işlenenin ikili gösteriminin her bitinde gerçekleştirilir:

    • And: Her iki bit de 1 ise sonuç biti 1 olur; aksi takdirde sonuç biti 0'dır.

    • Not: Bit 0 ise sonuç biti 1 olur; aksi takdirde sonuç biti 1'dir.

    • Or: Bitlerden biri 1 ise sonuç biti 1 olur; aksi takdirde sonuç biti 0'dır.

    • Xor: Bitlerden biri 1 ise ancak her ikisi de bit değilse sonuç biti 1 olur; aksi takdirde sonuç biti 0'dır (yani, 1 Xor 0 = 1, 1 1 Xor = 0).

  • Mantıksal işleçler And ve Or türü Boolean?için kaldırıldığında, üç değerli Boole mantığını kapsayacak şekilde genişletilir:

    • And her iki işlenen de true ise true olarak değerlendirilir; işlenenlerden biri false ise false; Nothing yoksa.

    • Or işlenenlerden biri true ise true olarak değerlendirilir; false, her iki işlenen de false'tur; Nothing yoksa.

Örneğin:

Module Test
    Sub Main()
        Dim x?, y? As Boolean

        x = Nothing
        y = True 

        If x Or y Then
            ' Will execute
        End If
    End Sub
End Module

Not. İdeal olarak mantıksal işleçler ve Or mantıksal işleçlerAnd, Boole ifadesinde kullanılabilecek herhangi bir tür için üç değerli mantık kullanılarak (yani ve IsFalseuygulayan IsTrue bir tür), boole ifadesinde kullanılabilecek herhangi bir tür üzerinde aynı şekilde AndAlso ve OrElse kısa devre kullanılarak kaldırılır. Ne yazık ki, üç değerli kaldırma yalnızca öğesine Boolean?uygulanır, bu nedenle üç değerli mantık isteyen kullanıcı tanımlı türlerin null atanabilir sürümleri için tanımlama ve Or işleçler kullanarak And bunu el ile yapması gerekir.

Bu işlemlerden taşma mümkün değildir. Numaralandırılmış tür işleçleri, numaralandırılmış türün temel türü üzerinde bit düzeyinde işlemi yapar, ancak dönüş değeri numaralandırılmış türdür.

İşlem Türü Değil:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo SB Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL İşte İşte İşte Hata Hata İşte Ob

Ve, Veya, Xor İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Bo SB Sh Sh In In İşte İşte İşte İşte İşte İşte Hata Hata Bo Ob
SB SB Sh Sh In In İşte İşte İşte İşte İşte İşte Hata Hata İşte Ob
Tarafından Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL İşte İşte İşte Hata Hata İşte Ob
Sh Sh In In İşte İşte İşte İşte İşte İşte Hata Hata İşte Ob
ABD ABD In Kullanıcı Arayüzü (UI) İşte UL İşte İşte İşte Hata Hata İşte Ob
İçinde In İşte İşte İşte İşte İşte İşte Hata Hata İşte Ob
kullanıcı arabirimi Kullanıcı Arayüzü (UI) İşte UL İşte İşte İşte Hata Hata İşte Ob
İşte İşte İşte İşte İşte İşte Hata Hata İşte Ob
UL UL İşte İşte İşte Hata Hata İşte Ob
De İşte İşte İşte Hata Hata İşte Ob
Si İşte İşte Hata Hata İşte Ob
Yapmak İşte Hata Hata İşte Ob
Da Hata Hata Hata Hata
Caner Hata Hata Hata
St İşte Ob
Ob Ob

Kısa devre Mantıksal İşleçleri

AndAlso ve OrElse işleçleri ve Or mantıksal işleçlerinin And kısa devre sürümleridir.

ShortCircuitLogicalOperatorExpression
    : Expression 'AndAlso' LineTerminator? Expression
    | Expression 'OrElse' LineTerminator? Expression
    ;

Kısa devre davranışı nedeniyle, ilk işlenen değerlendirildikten sonra işleç sonucu biliniyorsa ikinci işlenen çalışma zamanında değerlendirilmez.

Kısa devre mantıksal işleçleri aşağıdaki gibi değerlendirilir:

  • bir AndAlso işlemdeki ilk işlenen, işlecinden True IsFalse sonucunu False verirse veya döndürürse, ifade ilk işlenenini döndürür. Aksi takdirde, ikinci işlenen değerlendirilir ve iki sonuç üzerinde mantıksal And bir işlem gerçekleştirilir.

  • bir OrElse işlemdeki ilk işlenen, işlecinden True IsTrue sonucunu True verirse veya döndürürse, ifade ilk işlenenini döndürür. Aksi takdirde, ikinci işlenen değerlendirilir ve iki sonucu üzerinde mantıksal Or bir işlem gerçekleştirilir.

AndAlso ve OrElse işleçleri türü Booleaniçin veya aşağıdaki işleçleri aşırı yükleyen herhangi bir tür T için tanımlanır:

Public Shared Operator IsTrue(op As T) As Boolean
Public Shared Operator IsFalse(op As T) As Boolean

ve ilgili And veya Or işleci aşırı yükleme:

Public Shared Operator And(op1 As T, op2 As T) As T
Public Shared Operator Or(op1 As T, op2 As T) As T

veya OrElse işleçleri değerlendirilirkenAndAlso, ilk işlenen yalnızca bir kez değerlendirilir ve ikinci işlenen tam olarak bir kez değerlendirilmez veya değerlendirilmez. Örneğin, aşağıdaki kodu göz önünde bulundurun:

Module Test
    Function TrueValue() As Boolean
        Console.Write(" True")
        Return True
    End Function

    Function FalseValue() As Boolean
        Console.Write(" False")
        Return False
    End Function

    Sub Main()
        Console.Write("And:")
        If FalseValue() And TrueValue() Then
        End If
        Console.WriteLine()

        Console.Write("Or:")
        If TrueValue() Or FalseValue() Then
        End If
        Console.WriteLine()

        Console.Write("AndAlso:")
        If FalseValue() AndAlso TrueValue() Then
        End If
        Console.WriteLine()

        Console.Write("OrElse:")
        If TrueValue() OrElse FalseValue() Then
        End If
        Console.WriteLine()
    End Sub
End Module

Aşağıdaki sonucu yazdırır:

And: False True
Or: True False
AndAlso: False
OrElse: True

ve işleçlerinin AndAlso kaldırılmış biçiminde, ilk işlenen null Boolean?ise, ikinci işlenen değerlendirilir ancak sonuç her zaman null Boolean?olur.OrElse

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Bo Bo Bo Bo Bo Bo Bo Bo Bo Bo Bo Bo Bo Hata Hata Bo Ob
SB Bo Bo Bo Bo Bo Bo Bo Bo Bo Bo Bo Hata Hata Bo Ob
Tarafından Bo Bo Bo Bo Bo Bo Bo Bo Bo Bo Hata Hata Bo Ob
Sh Bo Bo Bo Bo Bo Bo Bo Bo Bo Hata Hata Bo Ob
ABD Bo Bo Bo Bo Bo Bo Bo Bo Hata Hata Bo Ob
İçinde Bo Bo Bo Bo Bo Bo Bo Hata Hata Bo Ob
kullanıcı arabirimi Bo Bo Bo Bo Bo Bo Hata Hata Bo Ob
İşte Bo Bo Bo Bo Bo Hata Hata Bo Ob
UL Bo Bo Bo Bo Hata Hata Bo Ob
De Bo Bo Bo Hata Hata Bo Ob
Si Bo Bo Hata Hata Bo Ob
Yapmak Bo Hata Hata Bo Ob
Da Hata Hata Hata Hata
Caner Hata Hata Hata
St Bo Ob
Ob Ob

Shift İşleçleri

İkili işleçler << ve >> bit kaydırma işlemleri gerçekleştirin.

ShiftOperatorExpression
    : Expression '<' '<' LineTerminator? Expression
    | Expression '>' '>' LineTerminator? Expression
    ;

İşleçler , , SByte, UShort, Short, UInteger, IntegerULong ve Long türleri için Bytetanımlanır. Diğer ikili işleçlerden farklı olarak, shift işleminin sonuç türü işleç yalnızca sol işlenene sahip bir tekli işleçmiş gibi belirlenir. Doğru işlenenin türü örtük olarak dönüştürülebilir Integer olmalıdır ve işlemin sonuç türünü belirlemede kullanılmaz.

işleci, << ilk işlenendeki bitlerin vardiya miktarıyla belirtilen yer sayısını sola kaydırmasına neden olur. Sonuç türü aralığının dışındaki yüksek sıralı bitler atılır ve düşük sıralı boş bit konumları sıfır doldurulur.

işleci, >> ilk işlenendeki bitlerin vardiya miktarı tarafından belirtilen yer sayısı kadar sağa kaydırılmasına neden olur. Düşük sıralı bitler atılır ve sol işlenen pozitifse yüksek sıralı boşaltılmış bit konumları sıfıra veya negatifse bire ayarlanır. Sol işlenen Byte, , UShortUInteger, türündeyse veya ULong boş yüksek sıralı bitler sıfır doluysa.

Shift işleçleri, ilk işlenenin temel gösteriminin bitlerini ikinci işlenenin miktarına göre değiştirir. İkinci işlenenin değeri ilk işlenendeki bit sayısından büyükse veya negatifse, kaydırma miktarı şu şekilde RightOperand And SizeMaskSizeMask hesaplanır:

LeftOperand Türü SizeMask
Byte, SByte 7 (&H7)
UShort, Short 15 (&HF)
UInteger, Integer 31 (&H1F)
ULong, Long 63 (&H3F)

Kaydırma miktarı sıfırsa, işlemin sonucu ilk işlenenin değeriyle aynıdır. Bu işlemlerden taşma mümkün değildir.

İşlem Türü:

Bo SB Tarafından Sh ABD İçinde kullanıcı arabirimi İşte UL De Si Yapmak Da Caner St Ob
Sh SB Tarafından Sh ABD In Kullanıcı Arayüzü (UI) İşte UL İşte İşte İşte Hata Hata İşte Ob

Boole İfadeleri

Boole ifadesi, doğru olup olmadığını veya yanlış olup olmadığını görmek için test edilebilen bir ifadedir.

BooleanExpression
    : Expression
    ;

Tercih sırasına göre boole ifadesinde bir tür T kullanılabilir:

  • T Boolean veya Boolean?

  • T genişletme dönüştürmesi var Boolean

  • T genişletme dönüştürmesi var Boolean?

  • T iki sahte işleç IsTrue tanımlar ve IsFalse.

  • T' den Boolean 'a Boolean? dönüştürme içermeyen bir daraltma dönüştürmesine Boolean?sahiptir.

  • T için bir daraltma dönüştürmesi Booleanvardır.

Not. Kapalıysa Option Strict , daraltma dönüştürmesi Boolean olan bir ifadenin derleme zamanı hatası olmadan kabul edileceğini ancak dil varsa yine de bir IsTrue işleci tercih edeceğine dikkat etmek ilginçtir. Bunun nedeni Option Strict yalnızca dilin kabul ettiği ve kabul etmediği şeyleri değiştirmesi ve hiçbir zaman ifadenin gerçek anlamını değiştirmemiş olmasıdır. Bu nedenle, IsTrue ne olursa olsun Option Strictdaraltma dönüştürmesi yerine her zaman tercih edilmesi gerekir.

Örneğin, aşağıdaki sınıf için bir genişletme dönüştürmesi Booleantanımlamaz. Sonuç olarak, deyimindeki If kullanımı işlecine bir çağrıya IsTrue neden olur.

Class MyBool
    Public Shared Widening Operator CType(b As Boolean) As MyBool
        ...
    End Operator

    Public Shared Narrowing Operator CType(b As MyBool) As Boolean
        ...
    End Operator

    Public Shared Operator IsTrue(b As MyBool) As Boolean
        ...
    End Operator

    Public Shared Operator IsFalse(b As MyBool) As Boolean
        ...
    End Operator
End Class

Module Test
    Sub Main()
        Dim b As New MyBool

        If b Then Console.WriteLine("True")
    End Sub
End Module

Boole ifadesi olarak yazıldıysa veya veya değerine dönüştürüldüyse BooleanBoolean?, değerin yanlış olması ve aksi takdirde yanlış olması True doğrudur.

Aksi takdirde Boole ifadesi işlecini çağırır IsTrue ve işleç döndürülürse TruedöndürürTrue; aksi takdirde false olur (ancak hiçbir zaman işleci çağırmazIsFalse).

Aşağıdaki örnekte, için bir daraltma dönüştürmesi vardır, Integer bu nedenle null Integer? değeri hem hem de Boolean? (null Booleandeğer veren) ve Boolean (özel durum oluşturan) bir daraltma dönüştürmesine Booleansahiptir. için daraltma dönüştürmesi Boolean? tercih edilir ve bu nedenle Boole ifadesi olarak "i" değeri olur False.

Dim i As Integer? = Nothing
If i Then Console.WriteLine()

Lambda İfadeleri

Lambda ifadesi, lambda yöntemi olarak adlandırılan anonim bir yöntemi tanımlar. Lambda yöntemleri, temsilci türlerini alan diğer yöntemlere "satır içi" yöntemleri geçirmeyi kolaylaştırır.

LambdaExpression
    : SingleLineLambda
    | MultiLineLambda
    ;

SingleLineLambda
    : LambdaModifier* 'Function' ( OpenParenthesis ParameterList? CloseParenthesis )? Expression
    | 'Sub' ( OpenParenthesis ParameterList? CloseParenthesis )? Statement
    ;

MultiLineLambda
    : MultiLineFunctionLambda
    | MultiLineSubLambda
    ;

MultiLineFunctionLambda
    : LambdaModifier? 'Function' ( OpenParenthesis ParameterList? CloseParenthesis )? ( 'As' TypeName )? LineTerminator
      Block
      'End' 'Function'
    ;

MultiLineSubLambda
    : LambdaModifier? 'Sub' ( OpenParenthesis ParameterList? CloseParenthesis )? LineTerminator
      Block
      'End' 'Sub'
    ;

LambdaModifier
    : 'Async' | 'Iterator'
    ;

Örnek:

Module Test
    Delegate Function IntFunc(x As Integer) As Integer

    Sub Apply(a() As Integer, func As IntFunc)
        For index As Integer = 0 To a.Length - 1
            a(index) = func(a(index))
        Next index
    End Sub

    Sub Main()
        Dim a() As Integer = { 1, 2, 3, 4 }

        Apply(a, Function(x As Integer) x * 2)

        For Each value In a
            Console.Write(value & " ")
        Next value
    End Sub
End Module

çıktısını alır:

2 4 6 8

Lambda ifadesi isteğe bağlı değiştiriciler Async veya Iteratorile başlar ve ardından anahtar sözcüğü Function veya Sub ve parametre listesi izler. Lambda ifadesindeki parametreler bildirilemez Optional veya ParamArray öznitelikleri olamaz. Normal yöntemlerden farklı olarak, bir lambda yöntemi için parametre türünün çıkarılmaması otomatik olarak çıkarılmaz Object. Bunun yerine, bir lambda yöntemi yeniden sınıflandırıldığında, atlanan parametre türleri ve ByRef değiştiriciler hedef türden çıkarılır. Önceki örnekte lambda ifadesi olarak Function(x) x * 2yazılabilirdi ve lambda yönteminin temsilci türünün x bir örneğini IntFunc oluşturmak için Integer kullanıldığı zaman olan türünü çıkarmış olacaktı. Yerel değişken çıkarımından farklı olarak, lambda yöntemi parametresi bir türü atlarsa ancak dizi veya null atanabilir ad değiştiricisi varsa, derleme zamanı hatası oluşur.

Normal lambda ifadesi, ne de AsyncIterator değiştiricisi olan bir ifadedir.

Yineleyici lambda ifadesi, değiştiricisi Iterator olan ve değiştiricisi olmayan Async ifadedir. Bir işlev olmalıdır. Bir değere yeniden sınıflandırıldığında, yalnızca dönüş türü , veya IEnumerable(Of T)IEnumerableIEnumerator(Of T) bazı Tiçin olan ve ByRef parametresi olmayan temsilci türündeki IEnumeratorbir değere yeniden sınıflandırılabilir.

Zaman uyumsuz lambda ifadesi değiştiricisi Async olan ve değiştiricisi olmayan Iterator ifadedir. Zaman uyumsuz bir alt lambda yalnızca ByRef parametresi olmayan alt temsilci türündeki bir değere yeniden sınıflandırılabilir. Zaman uyumsuz bir lambda işlevi yalnızca dönüş türü veya Task(Of T) bazıları Tiçin olan ve ByRef parametresi olmayan işlev temsilcisi türü Task değerine yeniden sınıflandırılabilir.

Lambda ifadeleri tek satırlı veya çok satırlı olabilir. Tek satırlı Function lambda ifadeleri, lambda yönteminden döndürülen değeri temsil eden tek bir ifade içerir. Tek satırlı Sub lambda ifadeleri, kapanışı StatementTerminatorolmadan tek bir deyim içerir. Örneğin:

Module Test
    Sub Do(a() As Integer, action As Action(Of Integer))
        For index As Integer = 0 To a.Length - 1
            action(a(index))
        Next index
    End Sub

    Sub Main()
        Dim a() As Integer = { 1, 2, 3, 4 }

        Do(a, Sub(x As Integer) Console.WriteLine(x))
    End Sub
End Module

Tek satırlı lambda yapıları diğer tüm ifadelere ve deyimlere göre daha az sıkı bağlanır. Bu nedenle, örneğin, "", "Function() x + 5" yerine "Function() (x+5)"(Function() x) + 5 ile eşdeğerdir. Belirsizliği önlemek için tek satırlı Sub lambda ifadesi Dim deyimi veya etiket bildirimi deyimi içermeyebilir. Ayrıca parantez içine alınmadığı sürece tek satırlı Sub lambda ifadesinin hemen ardından ":", üye erişim işleci ".", sözlük üyesi erişim işleci "!" veya açık parantez "(". Herhangi bir blok deyimi (With, SyncLock, If...EndIf, , While, For, Do) Usingveya OnErrorResumeiçeremez.

Not. lambda ifadesinde Function(i) x=i, gövde bir ifade olarak yorumlanır (eşit olup olmadığını x test i eder). Ancak lambda ifadesinde Sub(i) x=igövde bir deyim olarak yorumlanır (öğesini atar ix).

Çok satırlı lambda ifadesi bir deyim bloğu içerir ve uygun End bir deyimle (örneğin End Function veya End Sub) bitmelidir. Normal yöntemlerde olduğu gibi, çok satırlı bir lambda yönteminin Function veya Sub deyimi ve End deyimleri kendi satırlarında olmalıdır. Örneğin:

' Error: Function statement must be on its own line!
Dim x = Sub(x As Integer) : Console.WriteLine(x) : End Sub

' OK
Dim y = Sub(x As Integer)
               Console.WriteLine(x)
          End Sub

Çok satırlı Function lambda ifadeleri bir dönüş türü bildirebilir, ancak öznitelikleri buna koyamaz. Çok satırlı Function lambda ifadesi bir dönüş türü bildirmezse ancak dönüş türü lambda ifadesinin kullanıldığı bağlamdan çıkarılabilirse, bu dönüş türü kullanılır. Aksi takdirde işlevin dönüş türü aşağıdaki gibi hesaplanır:

  • Normal lambda ifadesinde dönüş türü, deyim bloğundaki tüm Return deyimlerdeki ifadelerin baskın türüdür.

  • Zaman uyumsuz lambda ifadesinde dönüş türü, Task(Of T)T deyim bloğundaki tüm Return deyimlerdeki ifadelerin baskın türüdür.

  • Yineleyici lambda ifadesinde dönüş türü, deyim bloğundaki tüm Yield deyimlerdeki ifadelerin baskın türüdür.IEnumerable(Of T)T

Örneğin:

Function f(min As Integer, max As Integer) As IEnumerable(Of Integer)
    If min > max Then Throw New ArgumentException()
    Dim x = Iterator Function()
                  For i = min To max
                    Yield i
                Next
               End Function

    ' infers x to be a delegate with return type IEnumerable(Of Integer)
    Return x()
End Function

Her durumda, (sırasıyla Yield) deyimleri yoksa Return veya aralarında baskın bir tür yoksa ve katı semantikler kullanılıyorsa, derleme zamanı hatası oluşur; aksi takdirde baskın tür örtük olurObject.

Dönüş türünün ulaşılabilir olmasa bile tüm Return deyimlerden hesaplandığını unutmayın. Örneğin:

' Return type is Double
Dim x = Function()
              Return 10
               Return 10.50
          End Function

Değişkenin adı olmadığından örtük dönüş değişkeni yoktur.

Çok satırlı lambda ifadelerinin içindeki deyim blokları aşağıdaki kısıtlamalara sahiptir:

  • On Error ve Resume deyimlerine izin verilmiyor, ancak Try deyimlere izin veriliyor.

  • Statik yerel değerler çok satırlı lambda ifadelerinde bildirilemez.

  • Normal dallanma kuralları içinde geçerli olsa da, çok satırlı lambda ifadesinin deyim bloğuna dallanması veya dışına dallanması mümkün değildir. Örneğin:

    Label1:
    Dim x = Sub()
                   ' Error: Cannot branch out
                   GoTo Label1
    
                   ' OK: Wholly within the lamba.
                   GoTo Label2:
              Label2:
              End Sub
    
    ' Error: Cannot branch in
    GoTo Label2
    

Lambda ifadesi kabaca içeren türde bildirilen anonim bir yöntemle eşdeğerdir. İlk örnek kabaca aşağıdakilere eşdeğerdir:

Module Test
    Delegate Function IntFunc(x As Integer) As Integer

    Sub Apply(a() As Integer, func As IntFunc)
        For index As Integer = 0 To a.Length - 1
            a(index) = func(a(index))
        Next index
    End Sub

    Function $Lambda1(x As Integer) As Integer
        Return x * 2
    End Function

    Sub Main()
        Dim a() As Integer = { 1, 2, 3, 4 }

        Apply(a, AddressOf $Lambda1)

        For Each value In a
            Console.Write(value & " ")
        Next value
    End Sub
End Module

Kapanışları

Lambda ifadeleri, kapsayan yöntem ve lambda ifadelerinde tanımlanan yerel değişkenler veya parametreler de dahil olmak üzere kapsamdaki tüm değişkenlere erişebilir. Lambda ifadesi yerel bir değişkene veya parametreye başvurduğunda, lambda ifadesi bir kapanışa başvuruda bulunılan değişkeni yakalar. Kapatma, yığın yerine yığında bulunan bir nesnedir ve bir değişken yakalandığında değişkene yapılan tüm başvurular kapanışa yönlendirilir. Bu, lambda ifadelerinin, içeren yöntem tamamlandıktan sonra bile yerel değişkenlere ve parametrelere başvurmaya devam etmelerini sağlar. Örneğin:

Module Test
    Delegate Function D() As Integer

    Function M() As D
        Dim x As Integer = 10
        Return Function() x
    End Function

    Sub Main()
        Dim y As D = M()

        ' Prints 10
        Console.WriteLine(y())
    End Sub
End Module

kabaca eşdeğerdir:

Module Test
    Delegate Function D() As Integer

    Class $Closure1
        Public x As Integer

        Function $Lambda1() As Integer
            Return x
        End Function
    End Class

    Function M() As D
        Dim c As New $Closure1()
        c.x = 10
        Return AddressOf c.$Lambda1
    End Function

    Sub Main()
        Dim y As D = M()

        ' Prints 10
        Console.WriteLine(y())
    End Sub
End Module

Kapatma, yerel değişkenin bildirildiği bloğu her girdiğinde yerel değişkenin yeni bir kopyasını yakalar, ancak varsa yeni kopya önceki kopyanın değeriyle başlatılır. Örneğin:

Module Test
    Delegate Function D() As Integer

    Function M() As D()
        Dim a(9) As D

        For i As Integer = 0 To 9
            Dim x
            a(i) = Function() x
            x += 1
        Next i

        Return a
    End Function

    Sub Main()
        Dim y() As D = M()

        For i As Integer = 0 To 9
            Console.Write(y(i)() & " ")
        Next i
    End Sub
End Module

Baskı

1 2 3 4 5 6 7 8 9 10

Onun yerine

9 9 9 9 9 9 9 9 9 9

Bir blok girilirken kapatmaların başlatılması gerektiğinden, bu bloğun dışından kapatılmış bir blok içine alınmasına izin verilmez GoTo , ancak kapatma ile bir bloğun içine alınmasına Resume izin verilir. Örneğin:

Module Test
    Sub Main()
        Dim a = 10

        If a = 10 Then
L1:
            Dim x = Function() a

            ' Valid, source is within block
            GoTo L2
L2:
        End If

        ' ERROR: target is inside block with closure
        GoTo L1
    End Sub
End Module

Bunlar bir kapanışta yakalanamadığından, lambda ifadesinin içinde aşağıdakiler görüntülenemez:

  • Başvuru parametreleri.

  • Türü bir sınıf değilse Me örnek ifadeleri (Me, MyClass, MyBase).

Lambda ifadesi ifadenin bir parçasıysa anonim tür oluşturma ifadesinin üyeleri. Örneğin:

' Error: Lambda cannot refer to anonymous type field
Dim x = New With { .a = 12, .b = Function() .a }

ReadOnly örnek oluşturucularındaki örnek değişkenleri veya ReadOnly değişkenlerin değer olmayan bir bağlamda kullanıldığı paylaşılan oluşturuculardaki paylaşılan değişkenler. Örneğin:

Class C1
    ReadOnly F1 As Integer

    Sub New()
        ' Valid, doesn't modify F1
        Dim x = Function() F1

        ' Error, tries to modify F1
        Dim f = Function() ModifyValue(F1)
    End Sub

    Sub ModifyValue(ByRef x As Integer)
    End Sub
End Class

Sorgu İfadeleri

Sorgu ifadesi, sorgulanabilir koleksiyonun öğelerine bir dizi sorgu işleci uygulayan bir ifadedir. Örneğin, aşağıdaki ifade bir nesne koleksiyonu Customer alır ve Washington eyaletindeki tüm müşterilerin adlarını döndürür:

Dim names = _
    From cust In Customers _
    Where cust.State = "WA" _
    Select cust.Name

Sorgu ifadesi bir From veya işleciyle başlamalıdır ve herhangi bir Aggregate sorgu işleciyle bitebilir. Sorgu ifadesinin sonucu değer olarak sınıflandırılır; ifadenin sonuç türü, ifadedeki son sorgu işlecinin sonuç türüne bağlıdır.

QueryExpression
    : FromOrAggregateQueryOperator QueryOperator*
    ;

FromOrAggregateQueryOperator
    : FromQueryOperator
    | AggregateQueryOperator
    ;

QueryOperator
    : FromQueryOperator
    | AggregateQueryOperator
    | SelectQueryOperator
    | DistinctQueryOperator
    | WhereQueryOperator
    | OrderByQueryOperator
    | PartitionQueryOperator
    | LetQueryOperator
    | GroupByQueryOperator
    | JoinOrGroupJoinQueryOperator
    ;

JoinOrGroupJoinQueryOperator
    : JoinQueryOperator
    | GroupJoinQueryOperator
    ;

Aralık Değişkenleri

Bazı sorgu işleçleri , aralık değişkeni olarak adlandırılan özel bir değişken türü sunar. Aralık değişkenleri gerçek değişkenler değildir; bunun yerine, sorgunun giriş koleksiyonları üzerinden değerlendirilmesi sırasında tek tek değerleri temsil eder.

CollectionRangeVariableDeclarationList
    : CollectionRangeVariableDeclaration ( Comma CollectionRangeVariableDeclaration )*
    ;

CollectionRangeVariableDeclaration
    : Identifier ( 'As' TypeName )? 'In' LineTerminator? Expression
    ;

ExpressionRangeVariableDeclarationList
    : ExpressionRangeVariableDeclaration ( Comma ExpressionRangeVariableDeclaration )*
    ;

ExpressionRangeVariableDeclaration
    : Identifier ( 'As' TypeName )? Equals Expression
    ;

Aralık değişkenlerinin kapsamı, tanıtılan sorgu işlecinden sorgu ifadesinin sonuna veya bunları gizleyen gibi Select bir sorgu işlecine kadar uzanıyor. Örneğin, aşağıdaki sorguda

Dim waCusts = _
    From cust As Customer In Customers _
    Where cust.State = "WA"

sorgu işleci, koleksiyondaki From her müşteriyi temsil eden olarak Customer yazılan bir aralık değişkeni cust tanıtırCustomers. Aşağıdaki Where sorgu işleci daha sonra filtre ifadesindeki aralık değişkenine cust başvurarak tek bir müşteriyi sonuçta elde edilen koleksiyonun dışına filtreleyip filtrelemeyeceğini belirler.

İki tür aralık değişkeni vardır: koleksiyon aralığı değişkenleri ve ifade aralığı değişkenleri. Koleksiyon aralığı değişkenleri, sorgulanan koleksiyonların öğelerinden değerlerini alır. Koleksiyon aralığı değişken bildirimindeki koleksiyon ifadesi, türü sorgulanabilir bir değer olarak sınıflandırılmalıdır. Koleksiyon aralığı değişkeninin türü atlanırsa, koleksiyon ifadesinin öğe türü olduğu veya Object koleksiyon ifadesinin bir öğe türü yoksa (yalnızca bir Cast yöntemi tanımlar) çıkarılır. Koleksiyon ifadesi sorgulanabilir değilse (örneğin, koleksiyonun öğe türü çıkarılamaz), derleme zamanı hata sonuçları.

İfade aralığı değişkeni, değeri koleksiyon yerine bir ifadeyle hesaplanan bir aralık değişkenidir. Aşağıdaki örnekte, sorgu işleci iki alandan Select hesaplanan adlı cityState bir ifade aralığı değişkeni tanıtır:

Dim cityStates = _
    From cust As Customer In Customers _
    Select cityState = cust.City & "," & cust.State _
    Where cityState.Length() < 10

Başka bir aralık değişkenine başvurmak için bir ifade aralığı değişkeni gerekli değildir, ancak bu tür bir değişken şüpheli bir değer olabilir. Bir ifade aralığı değişkenine atanan ifade değer olarak sınıflandırılmalı ve verilmişse aralık değişkeninin türüne örtük olarak dönüştürülebilir olmalıdır.

Yalnızca Let işlecinde bir ifade aralığı değişkeninin türü belirtilmiş olabilir. Diğer işleçlerde veya türü belirtilmemişse, aralık değişkeninin türünü belirlemek için yerel değişken türü çıkarımı kullanılır.

Bir aralık değişkeni, yerel değişkenleri gölgelendirmeye göre bildirme kurallarına uymalıdır. Bu nedenle, bir aralık değişkeni kapsayan yöntemde veya başka bir aralık değişkeninde yerel değişkenin veya parametrenin adını gizleyemez (sorgu işleci kapsamdaki tüm geçerli aralık değişkenlerini özel olarak gizlemediği sürece).

Sorgulanabilir Türler

Sorgu ifadeleri, ifadeyi bir koleksiyon türündeki iyi bilinen yöntemlere yapılan çağrılara çevirerek uygulanır. Bu iyi tanımlanmış yöntemler sorgulanabilir koleksiyonun öğe türünü ve koleksiyonda yürütülen sorgu işleçlerinin sonuç türlerini tanımlar. Her sorgu işleci, sorgu işlecinin genellikle çevrildiği yöntemi veya yöntemleri belirtir, ancak söz konusu çeviri uygulamaya bağımlıdır. Yöntemler belirtim içinde aşağıdakine benzer genel bir biçim kullanılarak verilir:

Function Select(selector As Func(Of T, R)) As CR

Aşağıdakiler yöntemler için geçerlidir:

  • Yöntemin koleksiyon türünün bir örneği veya uzantı üyesi olması ve erişilebilir olması gerekir.

  • Yöntem, tüm tür bağımsız değişkenlerini çıkarabilmek koşuluyla genel olabilir.

  • yöntemi aşırı yüklenebilir ve bu durumda tam olarak kullanılacak yöntemi belirlemek için aşırı yükleme çözümlemesi kullanılır.

  • Dönüş türü de dahil olmak üzere, eşleşen Func türle aynı imzaya sahip olması koşuluyla, temsilci türünün yerine başka bir temsilci Func türü kullanılabilir.

  • Dönüş türü System.Linq.Expressions.Expression(Of D) de dahil olmak üzere, eşleşen Func türle aynı imzaya Func sahip bir temsilci türü olması koşuluylaD, tür temsilci türü yerine kullanılabilir.

  • türü T , giriş koleksiyonunun öğe türünü temsil eder. Koleksiyon türü tarafından tanımlanan tüm yöntemlerin sorgulanabilir olması için aynı giriş öğesi türüne sahip olması gerekir.

  • türü S , birleştirme gerçekleştiren sorgu işleçleri söz konusu olduğunda ikinci giriş koleksiyonunun öğe türünü temsil eder.

  • tür K , anahtar olarak davranan bir dizi aralık değişkenine sahip sorgu işleçleri durumunda bir anahtar türünü temsil eder.

  • Tür N , sayısal tür olarak kullanılan bir türü temsil eder (ancak yine de iç sayısal tür değil kullanıcı tanımlı bir tür olabilir).

  • türü B , Boole ifadesinde kullanılabilecek bir türü temsil eder.

  • R Tür, sorgu işleci bir sonuç koleksiyonu üretirse sonuç koleksiyonunun öğe türünü temsil eder. R , sorgu işlecinin sonundaki kapsamdaki aralık değişkenlerinin sayısına bağlıdır. Tek bir aralık değişkeni kapsam içindeyse, R bu aralık değişkeninin türüdür. Örnekte

    Dim custNames = From c In Customers
                    Select c.Name
    

    sorgunun sonucu, öğe türüne sahip bir koleksiyon türü Stringolacaktır. Kapsam içinde birden çok aralık değişkeni varsa, R kapsam içindeki tüm aralık değişkenlerini alan olarak Key içeren anonim bir türdür. Örnekte:

    Dim custNames = From c In Customers, o In c.Orders 
                    Select Name = c.Name, ProductName = o.ProductName
    

    sorgunun sonucu, adlı salt okunur özelliği ve türünde adlı salt okunur ProductName özelliği NameString olan anonim türde bir öğe türüne sahip bir koleksiyon türü Stringolacaktır.

    Sorgu ifadesinde, aralık değişkenlerini içerecek şekilde oluşturulan anonim türler saydamdır; bu da aralık değişkenlerinin nitelik olmadan her zaman kullanılabilir olduğu anlamına gelir. Örneğin, önceki örnekte aralık değişkenleri c ve o giriş koleksiyonunun öğe türü anonim bir tür olsa bile sorgu işlecinde Select niteleme olmadan erişilebilir.

  • türü CX , öğe türü bir tür olan giriş koleksiyonu türünü değil, bir koleksiyon türünü Xtemsil eder.

Sorgulanabilir koleksiyon türü, tercih sırasına göre aşağıdaki koşullardan birini karşılamalıdır:

  • Uyumlu Select bir yöntem tanımlamalıdır.

  • Aşağıdaki yöntemlerden birine sahip olmalıdır

    Function AsEnumerable() As CT
    Function AsQueryable() As CT
    

    sorgulanabilir bir koleksiyon elde etmek için çağrılabilir. Her iki yöntem de sağlanmışsa, AsQueryable yerine AsEnumerabletercih edilir.

  • Bir yöntemi olmalıdır

    Function Cast(Of T)() As CT
    

    sorgulanabilir bir koleksiyon oluşturmak için aralık değişkeninin türüyle çağrılabilir.

Bir koleksiyonun öğe türünün belirlenmesi gerçek bir yöntem çağrısından bağımsız olarak gerçekleştiğinden, belirli yöntemlerin uygulanabilirliği belirlenemez. Bu nedenle, iyi bilinen yöntemlerle eşleşen örnek yöntemleri varsa bir koleksiyonun öğe türü belirlenirken, iyi bilinen yöntemlerle eşleşen tüm uzantı yöntemleri yoksayılır.

Sorgu işleci çevirisi, sorgu işleçlerinin ifadede gerçekleştiği sırada gerçekleşir. Her koleksiyon nesnesinin en azından sorgu işlecini desteklemesi Select gerekse de, bir koleksiyon nesnesinin tüm sorgu işleçleri tarafından gereken tüm yöntemleri uygulaması gerekmez. Gerekli bir yöntem yoksa derleme zamanı hatası oluşur. İyi bilinen yöntem adlarını bağlarken, gölgeleme semantiği hala geçerli olsa da, arabirimlerde ve uzantı yöntemi bağlamasında birden çok devralma amacıyla yöntem olmayanlar yoksayılır. Örneğin:

Class Q1
    Public Function [Select](selector As Func(Of Integer, Integer)) As Q1
    End Function
End Class

Class Q2
    Inherits Q1

    Public [Select] As Integer
End Class

Module Test
    Sub Main()
        Dim qs As New Q2()

        ' Error: Q2.Select still hides Q1.Select
        Dim zs = From q In qs Select q
    End Sub
End Module

Varsayılan Sorgu Dizin Oluşturucu

Öğe türü olan T ve zaten varsayılan özelliği olmayan her sorgulanabilir koleksiyon türü, aşağıdaki genel formun varsayılan özelliğine sahip olarak kabul edilir:

Public ReadOnly Default Property Item(index As Integer) As T
    Get
        Return Me.ElementAtOrDefault(index)
    End Get
End Property

Varsayılan özelliğe yalnızca varsayılan özellik erişim söz dizimi kullanılarak başvurulabilir; varsayılan özelliğe adla başvurulamaz. Örneğin:

Dim customers As IEnumerable(Of Customer) = ...
Dim customerThree = customers(2)

' Error, no such property
Dim customerFour = customers.Item(4)

Koleksiyon türünün bir ElementAtOrDefault üyesi yoksa derleme zamanı hatası oluşur.

Sorgu İşlecinden

Sorgu From işleci sorgulanacak bir koleksiyonun tek tek üyelerini temsil eden bir koleksiyon aralığı değişkeni tanıtır.

FromQueryOperator
    : LineTerminator? 'From' LineTerminator? CollectionRangeVariableDeclarationList
    ;

Örneğin, sorgu ifadesi:

From c As Customer In Customers ...

eşdeğer olarak düşünülebilir

For Each c As Customer In Customers
        ...
Next c

Sorgu From işleci birden çok koleksiyon aralığı değişkeni bildirdiğinde veya sorgu ifadesindeki ilk From sorgu işleci değilse, her yeni koleksiyon aralığı değişkeni var olan aralık değişkenleri kümesine çapraz olarak katılır . Sonuç olarak sorgu, birleştirilen koleksiyonlardaki tüm öğelerin çapraz çarpımları üzerinden değerlendirilir. Örneğin, ifade:

From c In Customers _
From e In Employees _
...

eşdeğer olarak düşünülebilir:

For Each c In Customers
    For Each e In Employees
            ...
    Next e
Next c

ve tam olarak şu değerle eşdeğerdir:

From c In Customers, e In Employees ...

Önceki sorgu işleçlerinde sunulan aralık değişkenleri daha sonraki From bir sorgu işlecinde kullanılabilir. Örneğin, aşağıdaki sorgu ifadesinde ikinci From sorgu işleci ilk aralık değişkeninin değerine başvurur:

From c As Customer In Customers _
From o As Order In c.Orders _
Select c.Name, o

Sorgu işlecindeki veya birden çok sorgu işlecindeki From birden çok From aralık değişkeni yalnızca koleksiyon türü aşağıdaki yöntemlerden birini veya her ikisini içeriyorsa desteklenir:

Function SelectMany(selector As Func(Of T, CR)) As CR
Function SelectMany(selector As Func(Of T, CS), _
                          resultsSelector As Func(Of T, S, R)) As CR

Kod

Dim xs() As Integer = ...
Dim ys() As Integer = ...
Dim zs = From x In xs, y In ys ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim ys() As Integer = ...
Dim zs = _
    xs.SelectMany( _
        Function(x As Integer) ys, _
        Function(x As Integer, y As Integer) New With {x, y})...

Not. From ayrılmış bir sözcük değildir.

Join Query İşleci

Sorgu Join işleci mevcut aralık değişkenlerini yeni bir koleksiyon aralığı değişkeniyle birleştirir ve öğeleri eşitlik ifadesi temelinde birleştirilmiş tek bir koleksiyon oluşturur.

JoinQueryOperator
    : LineTerminator? 'Join' LineTerminator? CollectionRangeVariableDeclaration
      JoinOrGroupJoinQueryOperator? LineTerminator? 'On' LineTerminator? JoinConditionList
    ;

JoinConditionList
    : JoinCondition ( 'And' LineTerminator? JoinCondition )*
    ;

JoinCondition
    : Expression 'Equals' LineTerminator? Expression
    ;

Örneğin:

Dim customersAndOrders = _
    From cust In Customers _
    Join ord In Orders On cust.ID Equals ord.CustomerID

Eşitlik ifadesi, normal bir eşitlik ifadesinden daha kısıtlıdır:

  • Her iki ifade de değer olarak sınıflandırılmalıdır.

  • Her iki ifade de en az bir aralık değişkenine başvurmalıdır.

  • Birleştirme sorgusu işlecinde bildirilen aralık değişkenine ifadelerden biri tarafından başvurulmalıdır ve bu ifade başka bir aralık değişkenine başvurmamalıdır.

İki ifadenin türleri tam olarak aynı türde değilse,

  • İki tür için eşitlik işleci tanımlanmışsa, her iki ifade de örtük olarak dönüştürülebilir ve Objectdeğildir, sonra her iki ifadeyi de bu türe dönüştürün.

  • Aksi takdirde, her iki ifadenin de örtük olarak dönüştürülebileceği baskın bir tür varsa, her iki ifadeyi de bu türe dönüştürün.

  • Aksi takdirde derleme zamanı hatası oluşur.

İfadeler, verimlilik için eşitlik işleçleri kullanmak yerine karma değerler (çağrılarak GetHashCode()) kullanılarak karşılaştırılır. Sorgu Join işleci aynı işleçte birden çok birleşim veya eşitlik koşulu gerçekleştirebilir. Sorgu Join işleci yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function Join(inner As CS, _
                  outerSelector As Func(Of T, K), _
                  innerSelector As Func(Of S, K), _
                  resultSelector As Func(Of T, S, R)) As CR

Kod

Dim xs() As Integer = ...
Dim ys() As Integer = ...
Dim zs = From x In xs _
            Join y In ys On x Equals y _
            ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim ys() As Integer = ...
Dim zs = _
    xs.Join( _
        ys, _
        Function(x As Integer) x, _
        Function(y As Integer) y, _
        Function(x As Integer, y As Integer) New With {x, y})...

Not.JoinOn ve Equals ayrılmış sözcükler değildir.

Sorgu İşlecine İzin Ver

Sorgu Let işleci bir ifade aralığı değişkeni tanıtır. Bu, sonraki sorgu işleçlerinde birden çok kez kullanılacak bir ara değerin bir kez hesaplanmasına olanak tanır.

LetQueryOperator
    : LineTerminator? 'Let' LineTerminator? ExpressionRangeVariableDeclarationList
    ;

Örneğin:

Dim taxedPrices = _
    From o In Orders _
    Let tax = o.Price * 0.088 _
    Where tax > 3.50 _
    Select o.Price, tax, total = o.Price + tax

eşdeğer olarak düşünülebilir:

For Each o In Orders
    Dim tax = o.Price * 0.088
    ...
Next o

Sorgu Let işleci yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function Select(selector As Func(Of T, R)) As CR

Kod

Dim xs() As Integer = ...
Dim zs = From x In xs _
            Let y = x * 10 _
            ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim zs = _
    xs.Select(Function(x As Integer) New With {x, .y = x * 10})...

Sorgu İşleci Seç

Sorgu Select işleci, ifade aralığı değişkenlerini tanıtan sorgu işleci gibidir Let ; ancak sorgu işleci, Select kullanılabilir aralık değişkenlerini bunlara eklemek yerine gizler. Ayrıca, bir sorgu işleci tarafından tanıtılan bir Select ifade aralığı değişkeninin türü her zaman yerel değişken türü çıkarım kuralları kullanılarak çıkarılır; açık bir tür belirtilemez ve hiçbir tür çıkarılamazsa derleme zamanı hatası oluşur.

SelectQueryOperator
    : LineTerminator? 'Select' LineTerminator? ExpressionRangeVariableDeclarationList
    ;

Örneğin, sorguda:

Dim smiths = _
    From cust In Customers _
    Select name = cust.name _
    Where name.EndsWith("Smith")

Where sorgu işleci yalnızca işleç tarafından Select tanıtılan aralık değişkenine name erişebilir; işleç başvurmayı custdeneseydi Where bir derleme zamanı hatası oluşurdu.

Bir sorgu işleci, aralık değişkenlerinin adlarını açıkça belirtmek yerine, Select anonim tür nesne oluşturma ifadeleriyle aynı kuralları kullanarak aralık değişkenlerinin adlarını çıkarsayabilir. Örneğin:

Dim custAndOrderNames = _
      From cust In Customers, ord In cust.Orders _
      Select cust.name, ord.ProductName _
        Where name.EndsWith("Smith")

Aralık değişkeninin adı sağlanmazsa ve bir ad çıkarılamazsa, derleme zamanı hatası oluşur. Select Sorgu işleci yalnızca tek bir ifade içeriyorsa, bu aralık değişkeni için bir ad çıkarılamıyor ancak aralık değişkeni adsızsa hata oluşmaz. Örneğin:

Dim custAndOrderNames = _
      From cust In Customers, ord In cust.Orders _
      Select cust.Name & " bought " & ord.ProductName _
        Take 10

Sorgu işlecinde Select bir aralık değişkenine ad atama ile eşitlik ifadesi arasında bir belirsizlik varsa, ad ataması tercih edilir. Örneğin:

Dim badCustNames = _
      From c In Customers _
        Let name = "John Smith" _
      Select name = c.Name ' Creates a range variable named "name"


Dim goodCustNames = _
      From c In Customers _
        Let name = "John Smith" _
      Select match = (name = c.Name)

Sorgu işlecindeki Select her ifade bir değer olarak sınıflandırılmalıdır. Sorgu Select işleci yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function Select(selector As Func(Of T, R)) As CR

Kod

Dim xs() As Integer = ...
Dim zs = From x In xs _
            Select x, y = x * 10 _
            ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim zs = _
    xs.Select(Function(x As Integer) New With {x, .y = x * 10})...

Ayrı Sorgu İşleci

Distinct Sorgu işleci, eşitlik için öğe türü karşılaştırılarak belirlendiği gibi, koleksiyondaki değerleri yalnızca benzersiz değerleri olan değerlerle kısıtlar.

DistinctQueryOperator
    : LineTerminator? 'Distinct' LineTerminator?
    ;

Örneğin, sorgu:

Dim distinctCustomerPrice = _
    From cust In Customers, ord In cust.Orders _
    Select cust.Name, ord.Price _
    Distinct

müşterinin aynı fiyata sahip birden çok siparişi olsa bile, her ayrı müşteri adı ve sipariş fiyatı çifti için yalnızca bir satır döndürür. Sorgu Distinct işleci yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function Distinct() As CT

Kod

Dim xs() As Integer = ...
Dim zs = From x In xs _
            Distinct _
            ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim zs = xs.Distinct()...

Not. Distinct ayrılmış bir sözcük değildir.

Where Query İşleci

Sorgu Where işleci, bir koleksiyondaki değerleri belirli bir koşulu karşılayan değerlerle kısıtlar.

WhereQueryOperator
    : LineTerminator? 'Where' LineTerminator? BooleanExpression
    ;

Where Sorgu işleci, her aralık değişkeni değeri kümesi için değerlendirilen bir Boole ifadesi alır; ifadenin değeri true ise, değerler çıkış koleksiyonunda görünür, aksi takdirde değerler atlanır. Örneğin, sorgu ifadesi:

From cust In Customers, ord In Orders _
Where cust.ID = ord.CustomerID _
...

iç içe döngüye eşdeğer olarak düşünülebilir

For Each cust In Customers
    For Each ord In Orders
            If cust.ID = ord.CustomerID Then
                ...
            End If
    Next ord
Next cust

Sorgu Where işleci yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function Where(predicate As Func(Of T, B)) As CT

Kod

Dim xs() As Integer = ...
Dim zs = From x In xs _
            Where x < 10 _
            ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim zs = _
    xs.Where(Function(x As Integer) x < 10)...

Not. Where ayrılmış bir sözcük değildir.

Bölüm Sorgusu İşleçleri

PartitionQueryOperator
    : LineTerminator? 'Take' LineTerminator? Expression
    | LineTerminator? 'Take' 'While' LineTerminator? BooleanExpression
    | LineTerminator? 'Skip' LineTerminator? Expression
    | LineTerminator? 'Skip' 'While' LineTerminator? BooleanExpression
    ;

Sorgu Take işleci bir koleksiyonun ilk n öğelerini döndürür. Değiştirici ile kullanıldığında işleç, Take boole ifadesini karşılayan bir koleksiyonun ilk n öğeleriyle While sonuçlanmaktadır. Skip işleci bir koleksiyonun ilk n öğelerini atlar ve ardından koleksiyonun geri kalanını döndürür. Değiştirici ile While birlikte kullanıldığında, Skip işleç boole ifadesini karşılayan bir koleksiyonun ilk n öğelerini atlar ve sonra koleksiyonun geri kalanını döndürür. Bir veya Skip sorgu işlecindeki Take ifadeler değer olarak sınıflandırılmalıdır.

Sorgu Take işleci yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function Take(count As N) As CT

Sorgu Skip işleci yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function Skip(count As N) As CT

Sorgu Take While işleci yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function TakeWhile(predicate As Func(Of T, B)) As CT

Sorgu Skip While işleci yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function SkipWhile(predicate As Func(Of T, B)) As CT

Kod

Dim xs() As Integer = ...
Dim zs = From x In xs _
            Skip 10 _
            Take 5 _
            Skip While x < 10 _
            Take While x > 5 _
            ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim zs = _
    xs.Skip(10). _
        Take(5). _
        SkipWhile(Function(x) x < 10). _
        TakeWhile(Function(x) x > 5)...

Not. Take ve Skip ayrılmış sözcükler değildir.

Sorgu İşlecine Göre Sırala

Sorgu Order By işleci, aralık değişkenlerinde görünen değerleri sıralar.

OrderByQueryOperator
    : LineTerminator? 'Order' 'By' LineTerminator? OrderExpressionList
    ;

OrderExpressionList
    : OrderExpression ( Comma OrderExpression )*
    ;

OrderExpression
    : Expression Ordering?
    ;

Ordering
    : 'Ascending' | 'Descending'
    ;

Sorgu Order By işleci, yineleme değişkenlerini sıralamak için kullanılması gereken anahtar değerlerini belirten ifadeler alır. Örneğin, aşağıdaki sorgu fiyata göre sıralanmış ürünleri döndürür:

Dim productsByPrice = _
    From p In Products _
    Order By p.Price _
    Select p.Name

Sıralama olarak Ascendingişaretlenebilir, bu durumda daha küçük değerler daha büyük değerlerden önce gelir veya Descendingbu durumda daha büyük değerler daha küçük değerlerden önce gelir. Belirtilmezse, sıralama için varsayılan değer olur Ascending. Örneğin, aşağıdaki sorgu, önce en pahalı ürünle fiyata göre sıralanmış ürünleri döndürür:

Dim productsByPriceDesc = _
    From p In Products _
    Order By p.Price Descending _
    Select p.Name

Sorgu Order By işleci sıralama için birden çok ifade belirtebilir ve bu durumda koleksiyon iç içe yerleştirilmiş bir şekilde sıralanır. Örneğin, aşağıdaki sorgu müşterileri eyalete göre, her eyalet içinde şehre ve sonra da her şehir içinde posta koduna göre sıralar:

Dim customersByLocation = _
    From c In Customers _
    Order By c.State, c.City, c.ZIP _
    Select c.Name, c.State, c.City, c.ZIP

Sorgu işlecindeki Order By ifadeler değer olarak sınıflandırılmalıdır. Sorgu Order By işleci yalnızca koleksiyon türü aşağıdaki yöntemlerden birini veya ikisini birden içeriyorsa desteklenir:

Function OrderBy(keySelector As Func(Of T, K)) As CT
Function OrderByDescending(keySelector As Func(Of T, K)) As CT

Dönüş türü CTsıralı bir koleksiyon olmalıdır. Sıralı koleksiyon, yöntemlerden birini veya her ikisini içeren bir koleksiyon türüdür:

Function ThenBy(keySelector As Func(Of T, K)) As CT
Function ThenByDescending(keySelector As Func(Of T, K)) As CT

Kod

Dim xs() As Integer = ...
Dim zs = From x In xs _
            Order By x Ascending, x Mod 2 Descending _
            ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim zs = _
    xs.OrderBy(Function(x) x).ThenByDescending(Function(x) x Mod 2)...

Not. Sorgu işleçleri söz dizimini belirli bir sorgu işlemini uygulayan yöntemlerle eşlediğinden, sıra koruma dili tarafından dikte edilmez ve işlecin kendisi tarafından belirlenir. Bu, kullanıcı tanımlı bir sayısal tür için toplama işlecini aşırı yüklemeye yönelik uygulamanın toplamaya benzer bir şey gerçekleştirmeyebileceği kullanıcı tanımlı işleçlere çok benzer. Tabii ki öngörülebilirliği korumak için kullanıcı beklentilerine uymayan bir şey uygulanması önerilmez.

Not. Order ve By ayrılmış sözcükler değildir.

Sorgu İşlecine Göre Gruplandır

Sorgu Group By işleci kapsam içindeki aralık değişkenlerini bir veya daha fazla ifadeye göre gruplandırıp bu gruplandırmalara göre yeni aralık değişkenleri oluşturur.

GroupByQueryOperator
    : LineTerminator? 'Group' ( LineTerminator? ExpressionRangeVariableDeclarationList )?
      LineTerminator? 'By' LineTerminator? ExpressionRangeVariableDeclarationList
      LineTerminator? 'Into' LineTerminator? ExpressionRangeVariableDeclarationList
    ;

Örneğin, aşağıdaki sorgu tüm müşterileri ölçütüne göre Stategruplandırıp her grubun sayısını ve ortalama yaşını hesaplar:

Dim averageAges = _
    From cust In Customers _
    Group By cust.State _
    Into Count(), Average(cust.Age)

Group By Sorgu işlecinin üç yan tümcesi vardır: isteğe bağlı Group yan tümcesi, By yan tümcesi ve Into yan tümcesi. Group yan tümcesi, sorgu işleciyle Select aynı söz dizimi ve etkiye sahiptir, ancak yan tümcesinde değil By yalnızca yan tümcesinde Into kullanılabilen aralık değişkenlerini etkiler. Örneğin:

Dim averageAges = _
    From cust In Customers _
    Group cust.Age By cust.State _
    Into Count(), Average(Age)

yan tümcesi By , gruplandırma işleminde anahtar değerleri olarak kullanılan ifade aralığı değişkenlerini bildirir. Into yan tümcesi, yan tümcesi tarafından oluşturulan grupların her biri üzerinde toplamaları hesaplayan ifade aralığı değişkenlerinin bildirimine By olanak tanır. yan tümcesi Into içinde, ifade aralığı değişkenine yalnızca bir toplama işlevinin yöntem çağrısı olan bir ifade atanabilir. Toplama işlevi, aşağıdaki yöntemlerden herhangi biri gibi görünen grubun koleksiyon türü (özgün koleksiyonun aynı koleksiyon türü olmayabilir) üzerindeki bir işlevdir:

Function _name_() As _type_
Function _name_(selector As Func(Of T, R)) As R

Toplama işlevi bir temsilci bağımsız değişkeni alırsa, çağırma ifadesinde değer olarak sınıflandırılması gereken bir bağımsız değişken ifadesi olabilir. Bağımsız değişken ifadesi kapsamdaki aralık değişkenlerini kullanabilir; toplama işlevi çağrısı içinde, bu aralık değişkenleri koleksiyondaki tüm değerleri değil, oluşturulan gruptaki değerleri temsil eder. Örneğin, bu bölümdeki Average özgün örnekte işlev, tüm müşterilerin birlikte çalışması yerine durum başına müşterilerin yaş ortalamasını hesaplar.

Tüm koleksiyon türlerinin üzerinde tanımlı toplama işlevi Group olduğu kabul edilir ve bu işlev parametre almaz ve yalnızca grubu döndürür. Bir koleksiyon türünün sağlayabilecekleri diğer standart toplama işlevleri şunlardır:

Count ve LongCount, gruptaki öğelerin sayısını veya bir Boole ifadesini karşılayan gruptaki öğelerin sayısını döndürür. Count ve LongCount yalnızca koleksiyon türü yöntemlerden birini içeriyorsa desteklenir:

Function Count() As N
Function Count(selector As Func(Of T, B)) As N
Function LongCount() As N
Function LongCount(selector As Func(Of T, B)) As N

Sum, gruptaki tüm öğelerde bir ifadenin toplamını döndürür. Sum yalnızca koleksiyon türü yöntemlerden birini içeriyorsa desteklenir:

Function Sum() As N
Function Sum(selector As Func(Of T, N)) As N

Min bu, gruptaki tüm öğeler arasında bir ifadenin en düşük değerini döndürür. Min yalnızca koleksiyon türü yöntemlerden birini içeriyorsa desteklenir:

Function Min() As N
Function Min(selector As Func(Of T, N)) As N

Max, gruptaki tüm öğelerde bir ifadenin en yüksek değerini döndürür. Max yalnızca koleksiyon türü yöntemlerden birini içeriyorsa desteklenir:

Function Max() As N
Function Max(selector As Func(Of T, N)) As N

Average, gruptaki tüm öğelerde bir ifadenin ortalamasını döndürür. Average yalnızca koleksiyon türü yöntemlerden birini içeriyorsa desteklenir:

Function Average() As N
Function Average(selector As Func(Of T, N)) As N

Any, bir grubun üye içerip içermediğini veya gruptaki herhangi bir öğe için Boole ifadesinin true olup olmadığını belirler. Any Boole ifadesinde kullanılabilecek bir değer döndürür ve yalnızca koleksiyon türü yöntemlerden birini içeriyorsa desteklenir:

Function Any() As B
Function Any(predicate As Func(Of T, B)) As B

All, bir Boole ifadesinin gruptaki tüm öğeler için doğru olup olmadığını belirler. All Boole ifadesinde kullanılabilecek bir değer döndürür ve yalnızca koleksiyon türü bir yöntem içeriyorsa desteklenir:

Function All(predicate As Func(Of T, B)) As B

Sorgu Group By işlecinden sonra, daha önce kapsamdaki aralık değişkenleri gizlenir ve ve Into yan tümceleri tarafından By sunulan aralık değişkenleri kullanılabilir. Sorgu Group By işleci yalnızca koleksiyon türü yöntemini içeriyorsa desteklenir:

Function GroupBy(keySelector As Func(Of T, K), _
                      resultSelector As Func(Of K, CT, R)) As CR

Yan tümcesindeki Group aralık değişkeni bildirimleri yalnızca koleksiyon türü yöntemini içeriyorsa desteklenir:

Function GroupBy(keySelector As Func(Of T, K), _
                      elementSelector As Func(Of T, S), _
                      resultSelector As Func(Of K, CS, R)) As CR

Kod

Dim xs() As Integer = ...
Dim zs = From x In xs _
            Group y = x * 10, z = x / 10 By evenOdd = x Mod 2 _
            Into Sum(y), Average(z) _
            ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim zs = _
    xs.GroupBy( _
        Function(x As Integer) x Mod 2, _
        Function(x As Integer) New With {.y = x * 10, .z = x / 10}, _
        Function(evenOdd, group) New With { _
            evenOdd, _
            .Sum = group.Sum(Function(e) e.y), _
            .Average = group.Average(Function(e) e.z)})...

Not.Group, Byve Into ayrılmış sözcükler değildir.

Toplama Sorgusu İşleci

Aggregate Sorgu işleci, işleçle Group By benzer bir işlev gerçekleştirir, ancak önceden oluşturulmuş grupların üzerinde toplamaya izin verir. Grup zaten biçimlendirilmiş olduğundan, Into sorgu işlecinin yan tümcesi kapsam içindeki aralık değişkenlerini gizlemez (bu şekilde, Aggregate daha çok bir Letgibi olur ve Group By daha çok gibi olurSelectAggregate).

AggregateQueryOperator
    : LineTerminator? 'Aggregate' LineTerminator? CollectionRangeVariableDeclaration QueryOperator*
      LineTerminator? 'Into' LineTerminator? ExpressionRangeVariableDeclarationList
    ;

Örneğin, aşağıdaki sorgu, Washington'daki müşteriler tarafından verilen tüm siparişlerin toplamını toplar:

Dim orderTotals = _
    From cust In Customers _
    Where cust.State = "WA" _
    Aggregate order In cust.Orders _
    Into Sum(order.Total)

Bu sorgunun sonucu, öğe türü olarak adlı bir özelliğe ve olarak yazılan Customer adlı custSumIntegerözelliğe sahip anonim bir tür olan bir koleksiyondur.

aksineGroup By, ve Into yan tümceleri arasına Aggregate ek sorgu işleçleri yerleştirilebilir. Yan Aggregate tümcesi ile yan tümcesinin Into sonu arasında, yan tümcesi tarafından bildirilenler de dahil olmak üzere kapsamdaki Aggregate tüm aralık değişkenleri kullanılabilir. Örneğin, aşağıdaki sorgu 2006'dan önce Washington'da müşteriler tarafından verilen tüm siparişlerin toplamını toplar:

Dim orderTotals = _
    From cust In Customers _
    Where cust.State = "WA" _
    Aggregate order In cust.Orders _
    Where order.Date <= #01/01/2006# _
    Into Sum = Sum(order.Total)

İşleç Aggregate , sorgu ifadesini başlatmak için de kullanılabilir. Bu durumda, sorgu ifadesinin sonucu yan tümcesi tarafından Into hesaplanan tek değer olacaktır. Örneğin, aşağıdaki sorgu 1 Ocak 2006'dan önceki tüm sipariş toplamlarının toplamını hesaplar:

Dim ordersTotal = _
    Aggregate order In Orders _
    Where order.Date <= #01/01/2006# _
    Into Sum(order.Total)

Sorgunun sonucu tek Integer bir değerdir. Sorgu Aggregate işleci her zaman kullanılabilir (ifadenin geçerli olması için toplama işlevinin de kullanılabilir olması gerekir). Kod

Dim xs() As Integer = ...
Dim zs = _
    Aggregate x In xs _
    Where x < 5 _
    Into Sum()

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim zs = _
    xs.Where(Function(x) x < 5).Sum()

Not.  Aggregate ve Into ayrılmış sözcükler değildir.

Grup Birleştirme Sorgusu İşleci

Sorgu Group Join işleci ve Group By sorgu işleçlerinin Join işlevlerini tek bir işleçte birleştirir. Group Join birleşim sol tarafındaki belirli bir öğeyle eşleşen birleştirmenin sağ tarafındaki tüm öğeleri gruplandırarak öğelerden ayıklanan eşleşen anahtarlara dayalı olarak iki koleksiyonu birleştirir. Bu nedenle, işleç bir dizi hiyerarşik sonuç üretir.

GroupJoinQueryOperator
    : LineTerminator? 'Group' 'Join' LineTerminator? CollectionRangeVariableDeclaration
      JoinOrGroupJoinQueryOperator? LineTerminator? 'On' LineTerminator? JoinConditionList
      LineTerminator? 'Into' LineTerminator? ExpressionRangeVariableDeclarationList
    ;

Örneğin, aşağıdaki sorgu tek bir müşterinin adını, tüm siparişlerinden oluşan bir grubu ve bu siparişlerin toplam miktarını içeren öğeler oluşturur:

Dim custsWithOrders = _
    From cust In Customers _
    Group Join order In Orders On cust.ID Equals order.CustomerID _ 
    Into Orders = Group, OrdersTotal = Sum(order.Total) _
    Select cust.Name, Orders, OrdersTotal

Sorgunun sonucu, öğe türü üç özelliğe sahip anonim bir tür olan bir koleksiyondur: Name, olarak Stringyazıldı, Orders öğe türü Order, ve OrdersTotalolarak yazılan bir koleksiyon olarak Integeryazıldı. Sorgu Group Join işleci yalnızca koleksiyon türü yöntemini içeriyorsa desteklenir:

Function GroupJoin(inner As CS, _
                         outerSelector As Func(Of T, K), _
                         innerSelector As Func(Of S, K), _
                         resultSelector As Func(Of T, CS, R)) As CR

Kod

Dim xs() As Integer = ...
Dim ys() As Integer = ...
Dim zs = From x In xs _
            Group Join y in ys On x Equals y _
            Into g = Group _
            ...

genel olarak şu şekilde çevrilir:

Dim xs() As Integer = ...
Dim ys() As Integer = ...
Dim zs = _
    xs.GroupJoin( _
        ys, _
        Function(x As Integer) x, _
        Function(y As Integer) y, _
        Function(x, group) New With {x, .g = group})...

Not.Group, Joinve Into ayrılmış sözcükler değildir.

Koşullu İfadeler

Koşullu If ifade bir ifadeyi test edip bir değer döndürür.

ConditionalExpression
    : 'If' OpenParenthesis BooleanExpression Comma Expression Comma Expression CloseParenthesis
    | 'If' OpenParenthesis Expression Comma Expression CloseParenthesis
    ;

Ancak çalışma zamanı işlevinin IIF aksine, koşullu ifade yalnızca gerekirse işlenenlerini değerlendirir. Bu nedenle, örneğin, If(c Is Nothing, c.Name, "Unknown") ifadesi değeri c ise Nothingbir özel durum oluşturmaz. Koşullu ifadenin iki biçimi vardır: biri iki işleneni, diğeri de üç işleneni alır.

Üç işlenen sağlanırsa, üç ifadenin de değer olarak sınıflandırılması ve ilk işlenenin boole ifadesi olması gerekir. İfadenin sonucu true ise, ikinci ifade işlecin sonucu olur, aksi takdirde üçüncü ifade işlecin sonucu olur. İfadenin sonuç türü, ikinci ve üçüncü ifade türleri arasındaki baskın türdür. Baskın bir tür yoksa derleme zamanı hatası oluşur.

İki işlenen sağlanmışsa, her iki işlenen de değer olarak sınıflandırılmalı ve ilk işlenen bir başvuru türü veya null atanabilir bir değer türü olmalıdır. If(x, y) İfade daha sonra ifadesi gibi If(x IsNot Nothing, x, y)değerlendirilir ve iki özel durum vardır. İlk olarak, ilk ifade yalnızca bir kez değerlendirilir ve ikincisi, ikinci işlenenin türü null atanamaz bir değer türüyse ve ilk işlenenin türü ise, ? ifadenin sonuç türü için baskın tür belirlenirken ilk işlenenin türünden kaldırılır. Örneğin:

Module Test
    Sub Main()
        Dim x?, y As Integer
        Dim a?, b As Long

        a = If(x, a)        ' Result type: Long?
        y = If(x, 0)        ' Result type: Integer
    End Sub
End Module

İfadenin her iki biçiminde de işlenen ise Nothing, baskın türü belirlemek için türü kullanılmaz. ifadesi If(<expression>, Nothing, Nothing)söz konusu olduğunda, baskın türü olarak Objectkabul edilir.

XML Değişmez İfadeleri

XML değişmez değeri ifadesi xml (genişletilebilir biçimlendirme dili) 1.0 değerini temsil eder.

XMLLiteralExpression
    : XMLDocument
    | XMLElement
    | XMLProcessingInstruction
    | XMLComment
    | XMLCDATASection
    ;

XML değişmez değeri ifadesinin sonucu, ad alanından türlerden System.Xml.Linq biri olarak yazılan bir değerdir. Bu ad alanı içindeki türler kullanılamıyorsa, XML değişmez değeri ifadesi derleme zamanı hatasına neden olur. Değerler, XML değişmez değeri ifadesinden çevrilen oluşturucu çağrıları aracılığıyla oluşturulur. Örneğin, kod:

Dim book As System.Xml.Linq.XElement = _
    <book title="My book"></book>

kabaca kodla eşdeğerdir:

Dim book As System.Xml.Linq.XElement = _
    New System.Xml.Linq.XElement( _
        "book", _
        New System.Xml.Linq.XAttribute("title", "My book"))

XML değişmez değeri ifadesi, XML belgesi, XML öğesi, XML işleme yönergesi, XML açıklaması veya CDATA bölümü biçiminde olabilir.

Not. Bu belirtim, Visual Basic dilinin davranışını açıklamak için xml'in yalnızca yeterince açıklamasını içerir. XML hakkında daha fazla bilgiyi adresinde http://www.w3.org/TR/REC-xml/bulabilirsiniz.

Sözcük kuralları

XMLCharacter
    : '<Unicode tab character (0x0009)>'
    | '<Unicode linefeed character (0x000A)>'
    | '<Unicode carriage return character (0x000D)>'
    | '<Unicode characters 0x0020 - 0xD7FF>'
    | '<Unicode characters 0xE000 - 0xFFFD>'
    | '<Unicode characters 0x10000 - 0x10FFFF>'
    ;

XMLString
    : XMLCharacter+
    ;

XMLWhitespace
    : XMLWhitespaceCharacter+
    ;

XMLWhitespaceCharacter
    : '<Unicode carriage return character (0x000D)>'
    | '<Unicode linefeed character (0x000A)>'
    | '<Unicode space character (0x0020)>'
    | '<Unicode tab character (0x0009)>'
    ;

XMLNameCharacter
    : XMLLetter
    | XMLDigit
    | '.'
    | '-'
    | '_'
    | ':'
    | XMLCombiningCharacter
    | XMLExtender
    ;

XMLNameStartCharacter
    : XMLLetter
    | '_'
    | ':'
    ;

XMLName
    : XMLNameStartCharacter XMLNameCharacter*
    ;

XMLLetter
    : '<Unicode character as defined in the Letter production of the XML 1.0 specification>'
    ;

XMLDigit
    : '<Unicode character as defined in the Digit production of the XML 1.0 specification>'
    ;

XMLCombiningCharacter
    : '<Unicode character as defined in the CombiningChar production of the XML 1.0 specification>'
    ;

XMLExtender
    : '<Unicode character as defined in the Extender production of the XML 1.0 specification>'
    ;

XML değişmez değer ifadeleri, normal Visual Basic kodunun sözcük temelli kuralları yerine XML sözcük kuralları kullanılarak yorumlanır. İki kural kümesi genellikle aşağıdaki yollarla farklılık gösterir:

  • Boşluk XML'de önemlidir. Sonuç olarak, XML değişmez değer ifadeleri için dil bilgisi, boşluklara izin verilen yerleri açıkça belirtir. Boşluk, bir öğe içindeki karakter verileri bağlamında gerçekleştiği durumlar dışında korunmaz. Örneğin:

    ' The following element preserves no whitespace
    Dim e1 = _
        <customer>
            <name>Bob</>
        </>
    
    ' The following element preserves all of the whitespace
    Dim e2 = _
        <customer>
            Bob
        </>
    
  • XML satır sonu boşluk XML belirtimine göre normalleştirilir.

  • XML büyük/küçük harfe duyarlıdır. Anahtar sözcükler büyük/küçük harfle tam olarak eşleşmelidir, aksi takdirde bir derleme zamanı hatası oluşur.

  • Satır sonlandırıcıları XML'de boşluk olarak kabul edilir. Sonuç olarak, XML değişmez değer ifadelerinde satır devamlılığı karakterleri gerekmez.

  • XML tam genişlikli karakterleri kabul etmez. Tam genişlikli karakterler kullanılırsa derleme zamanı hatası oluşur.

Eklenmiş ifadeler

XML değişmez değer ifadeleri katıştırılmış ifadeler içerebilir. Katıştırılmış ifade, değerlendirilen ve katıştırılmış ifadenin konumundaki bir veya daha fazla değeri doldurmak için kullanılan bir Visual Basic ifadesidir.

XMLEmbeddedExpression
    : '<' '%' '=' LineTerminator? Expression LineTerminator? '%' '>'
    ;

Örneğin, aşağıdaki kod dizeyi John Smith XML öğesinin değeri olarak yerleştirir:

Dim name as String = "John Smith"
Dim element As System.Xml.Linq.XElement = <customer><%= name %></customer>

İfadeler çeşitli bağlamlara eklenebilir. Örneğin, aşağıdaki kod adlı customerbir öğe oluşturur:

Dim name As String = "customer"
Dim element As System.Xml.Linq.XElement = <<%= name %>>John Smith</>

Katıştırılmış ifadenin kullanabildiği her bağlam kabul edilecek türleri belirtir. Ekli ifadenin ifade bölümü bağlamındayken, Visual Basic kodu için normal sözcük kuralları geçerli olmaya devam eder, örneğin satır devamlılıkları kullanılmalıdır:

' Visual Basic expression uses line continuation, XML does not
Dim element As System.Xml.Linq.XElement = _
    <<%= name & _
          name %>>John 
                     Smith</>

XML Belgeleri

XMLDocument
    : XMLDocumentPrologue XMLMisc* XMLDocumentBody XMLMisc*
    ;

XMLDocumentPrologue
    : '<' '?' 'xml' XMLVersion XMLEncoding? XMLStandalone? XMLWhitespace? '?' '>'
    ;

XMLVersion
    : XMLWhitespace 'version' XMLWhitespace? '=' XMLWhitespace? XMLVersionNumberValue
    ;

XMLVersionNumberValue
    : SingleQuoteCharacter '1' '.' '0' SingleQuoteCharacter
    | DoubleQuoteCharacter '1' '.' '0' DoubleQuoteCharacter
    ;

XMLEncoding
    : XMLWhitespace 'encoding' XMLWhitespace? '=' XMLWhitespace? XMLEncodingNameValue
    ;

XMLEncodingNameValue
    : SingleQuoteCharacter XMLEncodingName SingleQuoteCharacter
    | DoubleQuoteCharacter XMLEncodingName DoubleQuoteCharacter
    ;

XMLEncodingName
    : XMLLatinAlphaCharacter XMLEncodingNameCharacter*
    ;

XMLEncodingNameCharacter
    : XMLUnderscoreCharacter
    | XMLLatinAlphaCharacter
    | XMLNumericCharacter
    | XMLPeriodCharacter
    | XMLDashCharacter
    ;

XMLLatinAlphaCharacter
    : '<Unicode Latin alphabetic character (0x0041-0x005a, 0x0061-0x007a)>'
    ;

XMLNumericCharacter
    : '<Unicode digit character (0x0030-0x0039)>'
    ;

XMLHexNumericCharacter
    : XMLNumericCharacter
    | '<Unicode Latin hex alphabetic character (0x0041-0x0046, 0x0061-0x0066)>'
    ;

XMLPeriodCharacter
    : '<Unicode period character (0x002e)>'
    ;

XMLUnderscoreCharacter
    : '<Unicode underscore character (0x005f)>'
    ;

XMLDashCharacter
    : '<Unicode dash character (0x002d)>'
    ;

XMLStandalone
    : XMLWhitespace 'standalone' XMLWhitespace? '=' XMLWhitespace? XMLYesNoValue
    ;

XMLYesNoValue
    : SingleQuoteCharacter XMLYesNo SingleQuoteCharacter
    | DoubleQuoteCharacter XMLYesNo DoubleQuoteCharacter
    ;

XMLYesNo
    : 'yes'
    | 'no'
    ;

XMLMisc
    : XMLComment
    | XMLProcessingInstruction
    | XMLWhitespace
    ;

XMLDocumentBody
    : XMLElement
    | XMLEmbeddedExpression
    ;

XML belgesi, olarak yazılan bir değere neden olur System.Xml.Linq.XDocument. XML 1.0 belirtiminin aksine, XML belgesi prologunu belirtmek için XML değişmez değer ifadelerindeki XML belgeleri gereklidir; XML belgesi prologu olmayan XML değişmez değer ifadeleri, tek tek varlık olarak yorumlanır. Örneğin:

Dim doc As System.Xml.Linq.XDocument = _
    <?xml version="1.0"?>
    <?instruction?>
    <customer>Bob</>

Dim pi As System.Xml.Linq.XProcessingInstruction = _
    <?instruction?>

XML belgesi, türü herhangi bir türde olabilecek eklenmiş bir ifade içerebilir; ancak çalışma zamanında nesnesinin oluşturucunun gereksinimlerini karşılaması XDocument gerekir, aksi takdirde bir çalışma zamanı hatası oluşur.

Normal XML'nin aksine, XML belge ifadeleri DTD'leri (Belge Türü Bildirimleri) desteklemez. Ayrıca, xml değişmez değeri ifadesinin kodlaması her zaman kaynak dosyanın kodlaması ile aynı olduğundan, sağlanırsa kodlama özniteliği yoksayılır.

Not. Kodlama özniteliği yoksayılsa da, kaynak koda geçerli Xml 1.0 belgeleri ekleme özelliğini korumak için hala geçerli bir özniteliktir.

XML Öğeleri

XMLElement
    : XMLEmptyElement
    | XMLElementStart XMLContent XMLElementEnd
    ;

XMLEmptyElement
    : '<' XMLQualifiedNameOrExpression XMLAttribute* XMLWhitespace? '/' '>'
    ;

XMLElementStart
    : '<' XMLQualifiedNameOrExpression XMLAttribute* XMLWhitespace? '>'
    ;

XMLElementEnd
    : '<' '/' '>'
    | '<' '/' XMLQualifiedName XMLWhitespace? '>'
    ;

XMLContent
    : XMLCharacterData? ( XMLNestedContent XMLCharacterData? )+
    ;

XMLCharacterData
    : '<Any XMLCharacterDataString that does not contain the string "]]>">'
    ;

XMLCharacterDataString
    : '<Any Unicode character except < or &>'+
    ;

XMLNestedContent
    : XMLElement
    | XMLReference
    | XMLCDATASection
    | XMLProcessingInstruction
    | XMLComment
    | XMLEmbeddedExpression
    ;

XMLAttribute
    : XMLWhitespace XMLAttributeName XMLWhitespace? '=' XMLWhitespace? XMLAttributeValue
    | XMLWhitespace XMLEmbeddedExpression
    ;

XMLAttributeName
    : XMLQualifiedNameOrExpression
    | XMLNamespaceAttributeName
    ;

XMLAttributeValue
    : DoubleQuoteCharacter XMLAttributeDoubleQuoteValueCharacter* DoubleQuoteCharacter
    | SingleQuoteCharacter XMLAttributeSingleQuoteValueCharacter* SingleQuoteCharacter
    | XMLEmbeddedExpression
    ;

XMLAttributeDoubleQuoteValueCharacter
    : '<Any XMLCharacter except <, &, or DoubleQuoteCharacter>'
    | XMLReference
    ;

XMLAttributeSingleQuoteValueCharacter
    : '<Any XMLCharacter except <, &, or SingleQuoteCharacter>'
    | XMLReference
    ;

XMLReference
    : XMLEntityReference
    | XMLCharacterReference
    ;

XMLEntityReference
    : '&' XMLEntityName ';'
    ;

XMLEntityName
    : 'lt' | 'gt' | 'amp' | 'apos' | 'quot'
    ;

XMLCharacterReference
    : '&' '#' XMLNumericCharacter+ ';'
    | '&' '#' 'x' XMLHexNumericCharacter+ ';'
    ;

XML öğesi olarak System.Xml.Linq.XElementyazılan bir değerle sonuçlanmıştır. Normal XML'nin aksine, XML öğeleri kapanış etiketindeki adı atlayabilir ve geçerli en iç içe öğe kapatılır. Örneğin:

Dim name = <name>Bob</>

XML öğesindeki öznitelik bildirimleri, olarak System.Xml.Linq.XAttributeyazılan değerlerle sonuçlanır. Öznitelik değerleri XML belirtimine göre normalleştirilir. Özniteliğin değeri olduğunda Nothing özniteliği oluşturulmaz, bu nedenle öznitelik değeri ifadesinin denetlenmesi Nothinggerekmez. Örneğin:

Dim expr = Nothing

' Throws null argument exception
Dim direct = New System.Xml.Linq.XElement( _
    "Name", _
    New System.Xml.Linq.XAttribute("Length", expr))

' Doesn't throw exception, the result is <Name/>
Dim literal = <Name Length=<%= expr %>/>

XML öğeleri ve öznitelikleri aşağıdaki yerlerde iç içe ifadeler içerebilir:

öğesinin adıdır; bu durumda katıştırılmış ifade örtük olarak dönüştürülebilir System.Xml.Linq.XNamebir tür değeri olmalıdır. Örneğin:

Dim name = <<%= "name" %>>Bob</>

öğesinin özniteliğinin adıdır ve bu durumda katıştırılmış ifade örtük olarak dönüştürülebilir System.Xml.Linq.XNamebir tür değeri olmalıdır. Örneğin:

Dim name = <name <%= "length" %>="3">Bob</>

öğesinin özniteliğinin değeridir ve bu durumda katıştırılmış ifade herhangi bir türde bir değer olabilir. Örneğin:

Dim name = <name length=<%= 3 %>>Bob</>

öğesinin özniteliğidir ve bu durumda katıştırılmış ifade herhangi bir türde bir değer olabilir. Örneğin:

Dim name = <name <%= new XAttribute("length", 3) %>>Bob</>

öğesinin içeriği, bu durumda katıştırılmış ifade herhangi bir türde bir değer olabilir. Örneğin:

Dim name = <name><%= "Bob" %></>

Katıştırılmış ifadenin türü ise Object(), dizi oluşturucuya XElement parametre olarak geçirilir.

XML Ad Alanları

XML öğeleri, XML ad alanları 1.0 belirtimi tarafından tanımlandığı gibi XML ad alanı bildirimleri içerebilir.

XMLNamespaceAttributeName
    : XMLPrefixedNamespaceAttributeName
    | XMLDefaultNamespaceAttributeName
    ;

XMLPrefixedNamespaceAttributeName
    : 'xmlns' ':' XMLNamespaceName
    ;

XMLDefaultNamespaceAttributeName
    : 'xmlns'
    ;

XMLNamespaceName
    : XMLNamespaceNameStartCharacter XMLNamespaceNameCharacter*
    ;

XMLNamespaceNameStartCharacter
    : '<Any XMLNameCharacter except :>'
    ;

XMLNamespaceNameCharacter
    : XMLLetter
    | '_'
    ;

XMLQualifiedNameOrExpression
    : XMLQualifiedName
    | XMLEmbeddedExpression
    ;

XMLQualifiedName
    : XMLPrefixedName
    | XMLUnprefixedName
    ;

XMLPrefixedName
    : XMLNamespaceName ':' XMLNamespaceName
    ;

XMLUnprefixedName
    : XMLNamespaceName
    ;

ad alanlarını xml tanımlamaya yönelik kısıtlamalar uygulanır ve xmlns derleme zamanı hataları oluşturur. XML ad alanı bildirimlerinin değerleri için eklenmiş bir ifade olamaz; sağlanan değer boş olmayan bir dize değişmez değeri olmalıdır. Örneğin:

' Declares a valid namespace
Dim customer = <db:customer xmlns:db="http://example.org/database">Bob</>

' Error: xmlns cannot be re-defined
Dim bad1 = <elem xmlns:xmlns="http://example.org/namespace"/>

' Error: cannot have an embedded expression
Dim bad2 = <elem xmlns:db=<%= "http://example.org/database" %>>Bob</>

Not. Bu belirtim, Visual Basic dilinin davranışını açıklamak için xml ad alanının yalnızca yeterince açıklamasını içerir. XML ad alanları hakkında daha fazla bilgiyi adresinde http://www.w3.org/TR/REC-xml-names/bulabilirsiniz.

XML öğesi ve öznitelik adları ad alanı adları kullanılarak nitelenebilir. Ad alanları normal XML'de olduğu gibi bağlanır ve dosya düzeyinde bildirilen tüm ad alanı içeri aktarmalarının, derleme ortamı tarafından bildirilen tüm ad alanı içeri aktarmaları tarafından kapatılan bildirimi kapsayan bir bağlamda bildirilmiş olarak kabul edilmesi dışındadır. Ad alanı adı bulunamazsa derleme zamanı hatası oluşur. Örneğin:

Imports System.Xml.Linq
Imports <xmlns:db="http://example.org/database">

Module Test
    Sub Main()
        ' Binds to the imported namespace above.
        Dim c1 = <db:customer>Bob</>

        ' Binds to the namespace declaration in the element
        Dim c2 = _
            <db:customer xmlns:db="http://example.org/database-other">Mary</>

        ' Binds to the inner namespace declaration
        Dim c3 = _
            <database xmlns:db="http://example.org/database-one">
                <db:customer xmlns:db="http://example.org/database-two">Joe</>
            </>

        ' Error: namespace db2 cannot be found
        Dim c4 = _
            <db2:customer>Jim</>
    End Sub
End Module

Bir öğede bildirilen XML ad alanları, katıştırılmış ifadelerin içindeki XML değişmez değerlerine uygulanmaz. Örneğin:

' Error: Namespace prefix 'db' is not declared
Dim customer = _
    <db:customer xmlns:db="http://example.org/database">
        <%= <db:customer>Bob</> %>
    </>

Not. Bunun nedeni, eklenmiş ifadenin işlev çağrısı da dahil olmak üzere herhangi bir şey olabileceğidir. İşlev çağrısı bir XML değişmez değeri ifadesi içeriyorsa, programcıların XML ad alanının uygulanmasını mı yoksa yoksayıldığını mı bekleyeceği açık değildir.

XML İşleme Yönergeleri

XML işleme yönergesi, olarak yazılan bir değere neden olur System.Xml.Linq.XProcessingInstruction. XML işleme yönergeleri, işleme yönergesinde geçerli söz dizimi olduğundan katıştırılmış ifadeler içeremez.

XMLProcessingInstruction
    : '<' '?' XMLProcessingTarget ( XMLWhitespace XMLProcessingValue? )? '?' '>'
    ;

XMLProcessingTarget
    : '<Any XMLName except a casing permutation of the string "xml">'
    ;

XMLProcessingValue
    : '<Any XMLString that does not contain a question-mark followed by ">">'
    ;

XML Açıklamaları

XML açıklaması, olarak yazılan bir değere neden olur System.Xml.Linq.XComment. XML açıklamaları, açıklama içinde geçerli söz dizimi olduğundan eklenmiş ifadeler içeremez.

XMLComment
    : '<' '!' '-' '-' XMLCommentCharacter* '-' '-' '>'
    ;

XMLCommentCharacter
    : '<Any XMLCharacter except dash (0x002D)>'
    | '-' '<Any XMLCharacter except dash (0x002D)>'
    ;

CDATA bölümleri

CDATA bölümü, olarak System.Xml.Linq.XCDatayazılan bir değerle sonuç verir. CDATA bölümleri, CDATA bölümünde geçerli söz dizimi olduğundan katıştırılmış ifadeler içeremez.

XMLCDATASection
    : '<' '!' ( 'CDATA' '[' XMLCDATASectionString? ']' )? '>'
    ;

XMLCDATASectionString
    : '<Any XMLString that does not contain the string "]]>">'
    ;

XML Üyesi Erişim İfadeleri

XML üyesi erişim ifadesi bir XML değerinin üyelerine erişir.

XMLMemberAccessExpression
    : Expression '.' LineTerminator? '<' XMLQualifiedName '>'
    | Expression '.' LineTerminator? '@' LineTerminator? '<' XMLQualifiedName '>'
    | Expression '.' LineTerminator? '@' LineTerminator? IdentifierOrKeyword
    | Expression '.' '.' '.' LineTerminator? '<' XMLQualifiedName '>'
    ;

XML üyesi erişim ifadelerinin üç türü vardır:

  • Xml adının tek bir noktayı izlediği öğe erişimi. Örneğin:

    Dim customer = _
        <customer>
            <name>Bob</>
        </>
    Dim customerName = customer.<name>.Value
    

    Öğe erişimi işleviyle eşler:

    Function Elements(name As System.Xml.Linq.XName) As _
        System.Collections.Generic.IEnumerable(Of _
            System.Xml.Linq.XNode)
    

    Bu nedenle yukarıdaki örnek aşağıdakine eşdeğerdir:

    Dim customerName = customer.Elements("name").Value
    
  • Visual Basic tanımlayıcının nokta ve at işareti izlediği veya XML adının nokta ve at işareti izlediği öznitelik erişimi. Örneğin:

    Dim customer = <customer age="30"/>
    Dim customerAge = customer.@age
    

    Öznitelik erişimi işleviyle eşler:

    Function AttributeValue(name As System.Xml.Linq.XName) as String
    

    Bu nedenle yukarıdaki örnek aşağıdakine eşdeğerdir:

    Dim customerAge = customer.AttributeValue("age")
    

    Not. AttributeValue Uzantı yöntemi (ve ilgili uzantı özelliğiValue) şu anda herhangi bir derlemede tanımlanmamıştır. Uzantı üyeleri gerekiyorsa, oluşturulan derlemede otomatik olarak tanımlanırlar.

  • Bir XML adının üç noktayı izlediği alt öğe erişimi. Örneğin:

    Dim company = _
        <company>
            <customers>
                <customer>Bob</>
                <customer>Mary</>
                <customer>Joe</>
            </>
        </>
    Dim customers = company...<customer>
    

    Alt bileşenler işleviyle eşler:

    Function Descendents(name As System.Xml.Linq.XName) As _
        System.Collections.Generic.IEnumerable(Of _
            System.Xml.Linq.XElement)
    

    Bu nedenle yukarıdaki örnek aşağıdakine eşdeğerdir:

    Dim customers = company.Descendants("customer")
    

XML üyesi erişim ifadesinin temel ifadesi bir değer olmalı ve şu türde olmalıdır:

  • Bir öğe veya alt öğe erişiyorsa ya da System.Xml.Linq.XContainer türetilmiş bir türe ya da System.Collections.Generic.IEnumerable(Of T) türetilmiş bir türe erişiyorsa, burada T veya System.Xml.Linq.XContainer türetilmiş bir türdür.

  • Öznitelik erişimi, System.Xml.Linq.XElement türetilmiş tür veya System.Collections.Generic.IEnumerable(Of T) türetilmiş bir tür ise, burada T veya türetilmiş bir türdür System.Xml.Linq.XElement .

XML üyesi erişim ifadelerindeki adlar boş olamaz. İçeri aktarmalar tarafından tanımlanan tüm ad alanları kullanılarak ad alanı nitelenebilir. Örneğin:

Imports <xmlns:db="http://example.org/database">

Module Test
    Sub Main()
        Dim customer = _
            <db:customer>
                <db:name>Bob</>
            </>
        Dim name = customer.<db:name>
    End Sub
End Module

XML üyesi erişim ifadesindeki noktalardan sonra veya köşeli ayraçlarla ad arasında boşluk kullanılamaz. Örneğin:

Dim customer = _
    <customer age="30">
        <name>Bob</>
    </>
' All the following are error cases
Dim age = customer.@ age
Dim name = customer.< name >
Dim names = customer...< name >

Ad alanı içindeki System.Xml.Linq türler kullanılamıyorsa, XML üyesi erişim ifadesi derleme zamanı hatasına neden olur.

Await İşleci

await işleci, Bölüm Zaman Uyumsuz Yöntemler bölümünde açıklanan zaman uyumsuz yöntemlerle ilgilidir.

AwaitOperatorExpression
    : 'Await' Expression
    ;

Await, içinde göründüğü hemen kapsayan yöntem veya lambda ifadesinin değiştiricisi varsa ve bu değiştiriciden Async sonra Await görünürse, başka bir yerde ayrılmamışsa ayrılmış bir Async sözcük olur. Ayrıca önişlemci yönergelerinde de kaydedilmez. Await işlecine yalnızca ayrılmış bir sözcük olduğu bir yöntemin veya lambda ifadelerinin gövdesinde izin verilir. Hemen kapsayan yöntem veya lambda içinde, bir await ifadesi bir Catch veya Finally bloğun gövdesinde, bir deyimin gövdesinde veya sorgu ifadesinin SyncLock içinde gerçekleşmeyebilir.

await işleci, değer olarak sınıflandırılması gereken ve türü beklenebilir bir tür veya Objectolması gereken tek bir ifade alır. Türü ise Object tüm işlemler çalışma zamanına kadar ertelenmiş olur. Aşağıdakilerin tümü doğruysa bir türün C beklenebilir olduğu söylenir:

  • Cbağımsız değişkeni olmayan ve bir tür Edöndüren adlı GetAwaiter erişilebilir bir örnek veya uzantı yöntemi içerir;

  • E bağımsız değişken içermeyen ve Boole türüne sahip adlı IsCompleted okunabilir bir örnek veya uzantı özelliği içerir;

  • E bağımsız değişken içermeyen adlı GetResult erişilebilir bir örnek veya uzantı yöntemi içerir;

  • Eveya ICriticalNotifyCompletionuygularSystem.Runtime.CompilerServices.INotifyCompletion.

bir ise GetResultSubawait ifadesi geçersiz olarak sınıflandırılır. Aksi takdirde await ifadesi bir değer olarak sınıflandırılır ve türü yöntemin GetResult dönüş türüdür.

Aşağıda, beklenebilen bir sınıf örneği verilmiştir:

Class MyTask(Of T)
    Function GetAwaiter() As MyTaskAwaiter(Of T)
        Return New MyTaskAwaiter With {.m_Task = Me}
    End Function

    ...
End Class

Structure MyTaskAwaiter(Of T)
    Implements INotifyCompletion

    Friend m_Task As MyTask(Of T)

    ReadOnly Property IsCompleted As Boolean
        Get
            Return m_Task.IsCompleted
        End Get
    End Property

    Sub OnCompleted(r As Action) Implements INotifyCompletion.OnCompleted
        ' r is the "resumptionDelegate"
        Dim sc = SynchronizationContext.Current
        If sc Is Nothing Then
            m_Task.ContinueWith(Sub() r())
        Else
            m_Task.ContinueWith(Sub() sc.Post(Sub() r(), Nothing))
        End If
    End Sub

    Function GetResult() As T
        If m_Task.IsCanceled Then Throw New TaskCanceledException(m_Task)
        If m_Task.IsFaulted Then Throw m_Task.Exception.InnerException
        Return m_Task.Result
    End Function
End Structure

Not. Kitaplık yazarlarının devamlılık temsilcisini çağırdıkları deseni, kendi çağrılan kendileriyle aynı SynchronizationContext şekilde izlemeleri OnCompleted önerilir. Ayrıca, yığın taşmasına neden olabileceğinden, geri gönderme temsilcisi yönteminde OnCompleted zaman uyumlu olarak yürütülmemelidir: bunun yerine, temsilci sonraki yürütme için kuyruğa alınmalıdır.

Denetim akışı bir Await işlece ulaştığında davranış aşağıdaki gibidir.

  1. GetAwaiter Await işleneninin yöntemi çağrılır. Bu çağrının sonucu , awaiter olarak kabul edilir.

  2. Awaiter'ın IsCompleted özelliği alınır. Sonuç doğruysa:

    1. GetResult Awaiter yöntemi çağrılır. bir işlevse GetResult await ifadesinin değeri bu işlevin dönüş değeridir.
  3. IsCompleted özelliği doğru değilse:

    1. Ya ICriticalNotifyCompletion.UnsafeOnCompleted da awaiter üzerinde çağrılır (awaiter türü E uygularsa ICriticalNotifyCompletion) veya INotifyCompletion.OnCompleted (aksi). Her iki durumda da zaman uyumsuz yöntemin geçerli örneğiyle ilişkilendirilmiş bir sağlama temsilcisi geçirir.

    2. Geçerli zaman uyumsuz yöntem örneğinin denetim noktası askıya alınır ve denetim akışı geçerli çağıranda sürdürülür ( Bölüm Zaman Uyumsuz Yöntemler'de tanımlanır).

    3. Daha sonra yeniden başlatma temsilcisi çağrılırsa,

      1. geri yükleme temsilcisi ilk olarak o sırada OnCompleted çağrıldığı duruma geri yüklerSystem.Threading.Thread.CurrentThread.ExecutionContext,
      2. ardından denetim akışını zaman uyumsuz yöntem örneğinin denetim noktasında sürdürür (bkz. Bölüm Zaman Uyumsuz Yöntemler),
      3. yukarıdaki 2.1'de olduğu gibi awaiter yöntemini çağırır GetResult .

Await işleneni Object türüne sahipse, bu davranış çalışma zamanına kadar ertelenmiştir:

  • 1. adım, bağımsız değişken olmadan GetAwaiter() çağrılarak gerçekleştirilir; bu nedenle çalışma zamanında isteğe bağlı parametreleri alan örnek yöntemlerine bağlanabilir.
  • 2. adım, bağımsız değişken olmadan IsCompleted() özelliği alınıp Boole'a iç dönüştürme denenerek gerçekleştirilir.
  • Adım 3.a, denenerek TryCast(awaiter, ICriticalNotifyCompletion)gerçekleştirilir ve bu başarısız olursa .DirectCast(awaiter, INotifyCompletion)

3.a'da geçirilen yeniden başlatma temsilcisi yalnızca bir kez çağrılabilir. Birden çok kez çağrılırsa, davranış tanımlanmamıştır.