Aracılığıyla paylaş


Visual Basic'teki türler

Visual Basic'teki iki temel tür kategorisi değer türleri ve başvuru türleridir. İlkel türler (dizeler hariç), numaralandırmalar ve yapılar değer türleridir. Sınıflar, dizeler, standart modüller, arabirimler, diziler ve temsilciler başvuru türleridir.

Her türün varsayılan değeri vardır; bu değer, başlatmadan sonra bu türdeki değişkenlere atanan değerdir.

TypeName
    : ArrayTypeName
    | NonArrayTypeName
    ;

NonArrayTypeName
    : SimpleTypeName
    | NullableTypeName
    ;

SimpleTypeName
    : QualifiedTypeName
    | BuiltInTypeName
    ;

QualifiedTypeName
    : Identifier TypeArguments? (Period IdentifierOrKeyword TypeArguments?)*
    | 'Global' Period IdentifierOrKeyword TypeArguments?
      (Period IdentifierOrKeyword TypeArguments?)*
    ;

TypeArguments
    : OpenParenthesis 'Of' TypeArgumentList CloseParenthesis
    ;

TypeArgumentList
    : TypeName ( Comma TypeName )*
    ;

BuiltInTypeName
    : 'Object'
    | PrimitiveTypeName
    ;

TypeModifier
    : AccessModifier
    | 'Shadows'
    ;

IdentifierModifiers
    : NullableNameModifier? ArrayNameModifier?
    ;

Değer Türleri ve Başvuru Türleri

Değer türleri ve başvuru türleri, bildirim söz dizimi ve kullanımı açısından benzer olsa da, bunların semantiği farklıdır.

Başvuru türleri çalışma zamanı yığınında depolanır; bunlara yalnızca bu depolamaya başvuru yoluyla erişilebilir. Başvuru türlerine her zaman başvurular aracılığıyla erişildiğinden, yaşam süreleri .NET Framework tarafından yönetilir. Belirli bir örneğe yönelik bekleyen başvurular izlenir ve örnek yalnızca daha fazla başvuru kalmadığında yok edilir. Başvuru türü değişkeni, bu tür bir değere, daha türetilmiş türde bir değere veya null değere başvuru içerir. Null değer hiçbir şeyi ifade etmez; null değerle atamak dışında bir şey yapmak mümkün değildir. Başvuru türünün bir değişkenine atama, başvuruda bulunan değerin bir kopyası yerine başvurunun bir kopyasını oluşturur. Başvuru türündeki bir değişken için varsayılan değer null değerdir.

Değer türleri bir dizi içinde veya başka bir tür içinde doğrudan yığında depolanır; depolamalarına yalnızca doğrudan erişilebilir. Değer türleri doğrudan değişkenler içinde depolandığından, yaşam süreleri bunları içeren değişkenin ömrüne göre belirlenir. Bir değer türü örneği içeren konum yok edildiğinde, değer türü örneği de yok edilir. Değer türlerine her zaman doğrudan erişilir; bir değer türüne başvuru oluşturmak mümkün değildir. Böyle bir başvuru yasaklanması, yok edilmiş bir değer sınıfı örneğine başvurmayı imkansız hale getirir. Değer türleri her zaman NotInheritableolduğundan, bir değer türünün değişkeni her zaman bu türde bir değer içerir. Bu nedenle, bir değer türünün değeri null değer olamaz ve daha türetilmiş bir nesneye başvuramaz. Değer türündeki bir değişkene atama, atanmakta olan değerin bir kopyasını oluşturur. Değer türündeki bir değişken için varsayılan değer, türün her değişken üyesini varsayılan değerine başlatmanın sonucudur.

Aşağıdaki örnekte başvuru türleri ile değer türleri arasındaki fark gösterilmektedir:

Class Class1
    Public Value As Integer = 0
End Class

Module Test
    Sub Main()
        Dim val1 As Integer = 0
        Dim val2 As Integer = val1
        val2 = 123
        Dim ref1 As Class1 = New Class1()
        Dim ref2 As Class1 = ref1
        ref2.Value = 123
        Console.WriteLine("Values: " & val1 & ", " & val2)
        Console.WriteLine("Refs: " & ref1.Value & ", " & ref2.Value)
    End Sub
End Module

Programın çıktısı:

Values: 0, 123
Refs: 123, 123

Yerel değişkenin val2 atanması yerel değişkeni val1 etkilemez çünkü her iki yerel değişken de bir değer türündedir (türü Integer) ve bir değer türünün her yerel değişkeninin kendi depolama alanı vardır. Buna karşılık, atama ref2.Value = 123; hem hem de ref1ref2 başvuruda bulunan nesneyi etkiler.

.NET Framework tür sistemiyle ilgili dikkate alınabilecek bir nokta, yapılar, numaralandırmalar ve ilkel türler (hariç String) değer türleri olsa da, bunların tümünün başvuru türlerinden devraldığıdır. Yapılar ve ilkel türler, öğesinden devralan başvuru türünden System.ValueTypeObjectdevralır. Numaralandırılmış türler, öğesinden devralan başvuru türünden System.EnumSystem.ValueTypedevralır.

Null Değer Alabilen Türler

Değer türleri için, ? bu türün null atanabilir sürümünü temsil etmek için tür adına bir değiştirici eklenebilir.

NullableTypeName
    : NonArrayTypeName '?'
    ;

NullableNameModifier
    : '?'
    ;

Null atanabilir bir değer türü, türün null olmayan sürümüyle aynı değerleri ve null değeri içerebilir. Bu nedenle, null atanabilir bir değer türü için türündeki bir değişkene atanması Nothing , değişkenin değerini değer türünün sıfır değerini değil null değere ayarlar. Örneğin:

Dim x As Integer = Nothing
Dim y As Integer? = Nothing

' Prints zero
Console.WriteLine(x)
' Prints nothing (because the value of y is the null value)
Console.WriteLine(y)

Değişken adına null atanabilir tür değiştiricisi koyarak değişkenin null atanabilir bir değer türünde olduğu da bildirilebilir. Netlik için, aynı bildirimde hem değişken adında hem de tür adında null atanabilir tür değiştiricisi olması geçerli değildir. Null atanabilir türler türü System.Nullable(Of T)kullanılarak uygulandığından, tür T? türü System.Nullable(Of T)ile eş anlamlıdır ve iki ad birbirinin yerine kullanılabilir. ? Değiştirici zaten null atanabilir bir türe yerleştirilemez; bu nedenle, veya System.Nullable(Of Integer)?türünü Integer?? bildirmek mümkün değildir.

Null atanabilir değer türüT?, üyelerine System.Nullable(Of T) ek olarak, temel alınan türden T türüne T?kaldırılan tüm işleçlere veya dönüştürmelere sahiptir. Kaldırma işlemi, işleçleri ve dönüştürmeleri temel alınan türden kopyalar ve çoğu durumda null atanamayan değer türleri için null atanabilir değer türlerinin yerine yazar. Bu, için geçerli T olan aynı dönüştürmelerin ve işlemlerin birçoğunun da geçerli olmasını T? sağlar.

Arabirim Uygulaması

Yapı ve sınıf bildirimleri, bir veya daha fazla Implements yan tümce aracılığıyla bir dizi arabirim türü uyguladıklarını bildirebilir.

TypeImplementsClause
    : 'Implements' TypeImplements StatementTerminator
    ;

TypeImplements
    : NonArrayTypeName ( Comma NonArrayTypeName )*
    ;

yan tümcesinde Implements belirtilen tüm türler arabirimler olmalı ve türün arabirimlerin tüm üyelerini uygulaması gerekir. Örneğin:

Interface ICloneable
    Function Clone() As Object
End Interface 

Interface IComparable
    Function CompareTo(other As Object) As Integer
End Interface 

Structure ListEntry
    Implements ICloneable, IComparable

    ...

    Public Function Clone() As Object Implements ICloneable.Clone
        ...
    End Function 

    Public Function CompareTo(other As Object) As Integer _
        Implements IComparable.CompareTo
        ...
    End Function 
End Structure

Bir arabirim uygulayan bir tür de örtük olarak arabirimin tüm temel arabirimlerini uygular. Tür yan tümcesindeki tüm temel arabirimleri Implements açıkça listelemese bile bu durum geçerlidir. Bu örnekte yapı hem TextBox hem ITextBoxde IControl uygular.

Interface IControl
    Sub Paint()
End Interface 

Interface ITextBox
    Inherits IControl

    Sub SetText(text As String)
End Interface 

Structure TextBox
    Implements ITextBox

    ...

    Public Sub Paint() Implements ITextBox.Paint
        ...
    End Sub

    Public Sub SetText(text As String) Implements ITextBox.SetText
        ...
    End Sub
End Structure

Bir türün kendi içinde ve içinde bir arabirim uyguladığını bildirmek, türün bildirim alanında hiçbir şey bildirmez. Bu nedenle, aynı ada sahip bir yöntemle iki arabirim uygulamak geçerlidir.

Türler bir tür parametresini kendi başına uygulayamaz, ancak kapsamdaki tür parametrelerini içerebilir.

Class C1(Of V)
    Implements V  ' Error, can't implement type parameter directly
    Implements IEnumerable(Of V)  ' OK, not directly implementing

    ...
End Class

Genel arabirimler, farklı tür bağımsız değişkenleri kullanılarak birden çok kez uygulanabilir. Ancak, sağlanan tür parametresi (tür kısıtlamalarından bağımsız olarak) bu arabirimin başka bir uygulamasıyla çakışabiliyorsa, genel bir tür parametresi kullanarak genel bir arabirim uygulayamaz. Örneğin:

Interface I1(Of T)
End Interface

Class C1
    Implements I1(Of Integer)
    Implements I1(Of Double)    ' OK, no overlap
End Class

Class C2(Of T)
    Implements I1(Of Integer)
    Implements I1(Of T)         ' Error, T could be Integer
End Class

İlkel Türler

İlkel türler, ad alanında System önceden tanımlanmış türlerin diğer adları olan anahtar sözcükler aracılığıyla tanımlanır. İlkel bir tür, diğer adlarından tamamen ayırt edilemez: ayrılmış sözcüğü Byte yazmak ile tam olarak aynıdır System.Byte. İlkel türler iç türler olarak da bilinir.

PrimitiveTypeName
    : NumericTypeName
    | 'Boolean'
    | 'Date'
    | 'Char'
    | 'String'
    ;

NumericTypeName
    : IntegralTypeName
    | FloatingPointTypeName
    | 'Decimal'
    ;

IntegralTypeName
    : 'Byte' | 'SByte' | 'UShort' | 'Short' | 'UInteger'
    | 'Integer' | 'ULong' | 'Long'
    ;

FloatingPointTypeName
    : 'Single' | 'Double'
    ;

İlkel tür normal bir türe diğer ad sağladığından, her ilkel türün üyeleri vardır. Örneğin, Integer üyeleri içinde System.Int32bildirilmiştir. Değişmez değerler, karşılık gelen türlerinin örnekleri olarak ele alınabilir.

  • İlkel türler, bazı ek işlemlere izin verdikleri için içindeki diğer yapı türlerinden farklıdır:

  • İlkel türler, değişmez değerler yazılarak değerlerin oluşturulmasına izin verir. Örneğin, 123I türünde Integerbir değişmez değerdir.

  • İlkel türlerin sabitlerini bildirmek mümkündür.

  • bir ifadenin işlenenlerinin tümü ilkel tür sabitleri olduğunda, derleyicinin derleme zamanında ifadeyi değerlendirmesi mümkündür. Böyle bir ifade sabit ifade olarak bilinir.

Visual Basic aşağıdaki temel türleri tanımlar:

  • İntegral değer türleri Byte (1 bayt işaretsiz tamsayı), SByte (1 bayt işaretli tamsayı), UShort (2 baytlı işaretsiz tamsayı), Short (2 bayt işaretli tamsayı), UInteger (4 baytlı işaretsiz tamsayı), Integer (4 bayt işaretli tamsayı), ULong (8 bayt işaretsiz tamsayı) ve Long (8 bayt imzalı tamsayı). Bu türler sırasıyla , System.SByte, System.UInt16, System.Int16, System.UInt32, , System.UInt64System.Int32ve System.Int64ile eşlerSystem.Byte. Tamser türünün varsayılan değeri değişmez 0değerine eşdeğerdir.

  • Kayan nokta değer türleri Single (4 baytlık kayan nokta) ve Double (8 baytlık kayan nokta). Bu türler sırasıyla ve System.Doubleile System.Single eşler. Kayan nokta türünün varsayılan değeri değişmez 0değerine eşdeğerdir.

  • Decimal ile eşlenen System.Decimaltür (16 baytlık ondalık değer). Ondalık değerinin varsayılan değeri değişmez değerle eşdeğerdir 0D.

  • Bir Boolean doğruluk değerini temsil eden değer türü, genellikle ilişkisel veya mantıksal işlemin sonucu. Değişmez değer türündedir System.Boolean. Türün Boolean varsayılan değeri değişmez değerine Falseeşdeğerdir.

  • Bir Date tarihi ve/veya saati temsil eden ve ile eşlenen System.DateTimedeğer türü. Türün Date varsayılan değeri değişmez değerine # 01/01/0001 12:00:00AM #eşdeğerdir.

  • Tek Char bir Unicode karakterini temsil eden ve ile System.Chareşlenen değer türü. türünün varsayılan değeri Char sabit ifadesine ChrW(0)eşdeğerdir.

  • Bir String Unicode karakter dizisini temsil eden ve ile System.Stringeşlenen başvuru türü. Türün String varsayılan değeri null değerdir.

Numaralandırma

Numaralandırmalar , öğesinden System.Enum devralan ve simgesel olarak ilkel integral türlerinden birinin değer kümesini temsil eden değer türleridir.

EnumDeclaration
    : Attributes? TypeModifier* 'Enum' Identifier
      ( 'As' NonArrayTypeName )? StatementTerminator
      EnumMemberDeclaration+
      'End' 'Enum' StatementTerminator
    ;

Numaralandırma türü Eiçin, varsayılan değer ifadesi CType(0, E)tarafından üretilen değerdir.

Numaralandırmanın temel alınan türü, numaralandırmada tanımlanan tüm numaralandırıcı değerlerini temsil eden bir tamsayı türü olmalıdır. Temel alınan bir tür belirtilirse, ad alanında , , , , , , , ULong, Longveya ilgili türlerinden System biri olmalıdırByte. IntegerUIntegerShortUShortSByte Temel alınan hiçbir tür açıkça belirtilmezse, varsayılan değer olur Integer.

Aşağıdaki örnek, temel alınan türüne Longsahip bir numaralandırma bildirir:

Enum Color As Long
    Red
    Green
    Blue
End Enum

Geliştirici, örneğinde olduğu gibi, aralığındaki Longdeğerlerin kullanımını etkinleştirmek, ancak aralığında olmayan Integerveya bu seçeneği gelecekte korumak için temel alınan türünü Longkullanmayı seçebilir.

Numaralandırma Üyeleri

Bir numaralandırmanın üyeleri, numaralandırmada bildirilen numaralandırılmış değerler ve sınıfından System.Enumdevralınan üyelerdir.

Numaralandırma üyesinin kapsamı, numaralandırma bildirimi gövdesidir. Bu, bir numaralandırma bildirimi dışında bir numaralandırma üyesinin her zaman nitelenmiş olması gerektiği anlamına gelir (tür bir ad alanı içeri aktarma yoluyla özel olarak bir ad alanına aktarılmadığı sürece).

Sabit ifade değerleri atlandığında numaralandırma üyesi bildirimleri için bildirim sırası önemlidir. Numaralandırma üyeleri örtük olarak yalnızca erişime sahiptir Public ; numaralandırma üyesi bildirimlerinde hiçbir erişim değiştiricisine izin verilmez.

EnumMemberDeclaration
    : Attributes? Identifier ( Equals ConstantExpression )? StatementTerminator
    ;

Numaralandırma Değerleri

Sabit listesi üye listesindeki numaralandırılmış değerler, temel sabit listesi türü olarak yazılan sabitler olarak bildirilir ve sabitlerin gerekli olduğu her yerde görüntülenebilir. ile sabit listesi üye tanımı, = ilişkili üyeye sabit ifade tarafından belirtilen değeri verir. Sabit ifade, temel alınan türe örtük olarak dönüştürülebilir bir tamsayı türü olarak değerlendirilmelidir ve temel alınan tür tarafından temsil edilebilecek değer aralığında olmalıdır. Sabit değerleri , 2.3ve 3.3 katı semantik içeren 1.5temel integral türüne Long örtük olarak dönüştürülebileceğinden aşağıdaki örnek hatayla gösterilir.

Option Strict On

Enum Color As Long
    Red = 1.5
    Green = 2.3
    Blue = 3.3
End Enum

Birden çok numaralandırma üyesi, aşağıda gösterildiği gibi aynı ilişkili değeri paylaşabilir:

Enum Color
    Red
    Green
    Blue
    Max = Blue
End Enum

Örnekte, aynı ilişkili değere sahip iki numaralandırma üyesi ( Blue ve Max ) olan bir numaralandırma gösterilmektedir.

Numaralandırmadaki ilk numaralandırıcı değer tanımında başlatıcı yoksa, karşılık gelen sabitin değeri olur 0. Başlatıcısı olmayan bir numaralandırma değeri tanımı, numaralandırıcıya önceki sabit listesi değerinin değeri tarafından 1artırılarak elde edilen değeri verir. Bu artan değer, temel alınan tür tarafından temsil edilebilecek değer aralığında olmalıdır.

Enum Color
    Red
    Green = 10
    Blue
End Enum 

Module Test
    Sub Main()
        Console.WriteLine(StringFromColor(Color.Red))
        Console.WriteLine(StringFromColor(Color.Green))
        Console.WriteLine(StringFromColor(Color.Blue))
    End Sub

    Function StringFromColor(c As Color) As String
        Select Case c
            Case Color.Red
                Return String.Format("Red = " & CInt(c))

            Case Color.Green
                Return String.Format("Green = " & CInt(c))

            Case Color.Blue
                Return String.Format("Blue = " & CInt(c))

            Case Else
                Return "Invalid color"
        End Select
    End Function
End Module

Yukarıdaki örnekte numaralandırma değerleri ve bunların ilişkili değerleri yazdırılır. Çıktı şudur:

Red = 0
Green = 10
Blue = 11

Değerlerin nedenleri şunlardır:

  • Numaralandırma değerine Red otomatik olarak atanır 0 (başlatıcısı olmadığından ve ilk numaralandırma değeri üyesi olduğundan).

  • Numaralandırma değerine Green açıkça değeri 10verilir.

  • Numaralandırma değerine Blue otomatik olarak, kendisinden önce gelen sabit listesi değerinden bir büyük değer atanır.

Sabit ifade doğrudan veya dolaylı olarak kendi ilişkili numaralandırma değerini (sabit ifadede döngüselliğe izin verilmez) kullanamaz. ve bildirimleri AB döngüsel olduğundan aşağıdaki örnek geçersizdir.

Enum Circular
    A = B
    B
End Enum

A açıkça bağlıdır B ve B örtük olarak bağlıdır A .

Sınıflar

Sınıf, veri üyeleri (sabitler, değişkenler ve olaylar), işlev üyeleri (yöntemler, özellikler, dizin oluşturucular, işleçler ve oluşturucular) ve iç içe türler içerebilen bir veri yapısıdır. Sınıflar başvuru türleridir.

ClassDeclaration
    : Attributes? ClassModifier* 'Class' Identifier TypeParameterList? StatementTerminator
      ClassBase?
      TypeImplementsClause*
      ClassMemberDeclaration*
      'End' 'Class' StatementTerminator
    ;

ClassModifier
    : TypeModifier
    | 'MustInherit'
    | 'NotInheritable'
    | 'Partial'
    ;

Aşağıdaki örnekte her üye türünü içeren bir sınıf gösterilmektedir:

Class AClass
    Public Sub New()
        Console.WriteLine("Constructor")
    End Sub

    Public Sub New(value As Integer)
        MyVariable = value
        Console.WriteLine("Constructor")
    End Sub

    Public Const MyConst As Integer = 12
    Public MyVariable As Integer = 34

    Public Sub MyMethod()
        Console.WriteLine("MyClass.MyMethod")
    End Sub

    Public Property MyProperty() As Integer
        Get
            Return MyVariable
        End Get

        Set (value As Integer)
            MyVariable = value
        End Set
    End Property

    Default Public Property Item(index As Integer) As Integer
        Get
            Return 0
        End Get

        Set (value As Integer)
            Console.WriteLine("Item(" & index & ") = " & value)
        End Set
    End Property

    Public Event MyEvent()

    Friend Class MyNestedClass
    End Class 
End Class

Aşağıdaki örnekte bu üyelerin kullanımları gösterilmektedir:

Module Test

    ' Event usage.
    Dim WithEvents aInstance As AClass

    Sub Main()
        ' Constructor usage.
        Dim a As AClass = New AClass()
        Dim b As AClass = New AClass(123)

        ' Constant usage.
        Console.WriteLine("MyConst = " & AClass.MyConst)

        ' Variable usage.
        a.MyVariable += 1
        Console.WriteLine("a.MyVariable = " & a.MyVariable)

        ' Method usage.
        a.MyMethod()

        ' Property usage.
        a.MyProperty += 1
        Console.WriteLine("a.MyProperty = " & a.MyProperty)
        a(1) = 1

        ' Event usage.
        aInstance = a
    End Sub 

    Sub MyHandler() Handles aInstance.MyEvent
        Console.WriteLine("Test.MyHandler")
    End Sub 
End Module

Sınıfa özgü iki değiştirici MustInherit vardır ve NotInheritable. Her ikisini de belirtmek geçersiz.

Sınıf Temel Belirtimi

Sınıf bildirimi, sınıfın doğrudan temel türünü tanımlayan bir temel tür belirtimi içerebilir.

ClassBase
    : 'Inherits' NonArrayTypeName StatementTerminator
    ;

Bir sınıf bildiriminin açık temel türü yoksa, doğrudan temel türü örtük olarak Objectolur. Örneğin:

Class Base
End Class

Class Derived
    Inherits Base
End Class

Temel türler kendi başına bir tür parametresi olamaz, ancak kapsamdaki tür parametrelerini içerebilir.

Class C1(Of V) 
End Class

Class C2(Of V)
    Inherits V    ' Error, type parameter used as base class 
End Class

Class C3(Of V)
    Inherits C1(Of V)    ' OK: not directly inheriting from V.
End Class

Sınıflar yalnızca ve sınıflarından Object türetilebilir. Bir sınıfın , , System.MulticastDelegateSystem.EnumSystem.Arrayveya System.Delegateöğesinden System.ValueTypetüretilmiş olması geçersizdir. Genel bir sınıf, System.Attribute ondan türetilen bir sınıftan veya sınıfından türetilemez.

Her sınıfın tam olarak bir doğrudan temel sınıfı vardır ve türetmede döngüsellik yasaktır. Bir NotInheritable sınıftan türetmek mümkün değildir ve temel sınıfın erişilebilirlik etki alanı veya sınıfın erişilebilirlik etki alanının üst kümesiyle aynı olmalıdır.

Sınıf Üyeleri

Bir sınıfın üyeleri, sınıf üyesi bildirimleri tarafından tanıtılan üyelerden ve doğrudan temel sınıfından devralınan üyelerden oluşur.

ClassMemberDeclaration
    : NonModuleDeclaration
    | EventMemberDeclaration
    | VariableMemberDeclaration
    | ConstantMemberDeclaration
    | MethodMemberDeclaration
    | PropertyMemberDeclaration
    | ConstructorMemberDeclaration
    | OperatorDeclaration
    ;

Sınıf üyesi bildiriminde , Protected, Friend, Protected Friendveya Private erişimi olabilirPublic. Bir sınıf üyesi bildirimi bir erişim değiştiricisi içermediğinde, değişken bildirimi olmadığı sürece bildirim varsayılan olarak Public erişim olarak ayarlanır; bu durumda erişim varsayılanıdır Private .

Sınıf üyesinin kapsamı, üye bildiriminin gerçekleştiği sınıf gövdesinin yanı sıra bu sınıfın kısıtlama listesidir (genelse ve kısıtlamaları varsa). Üyenin Friend erişimi varsa, kapsamı aynı programdaki veya erişim verilmiş Friend herhangi bir derlemedeki türetilmiş herhangi bir sınıfın sınıf gövdesine genişletilir ve üyenin Public, Protectedveya Protected Friend erişimi varsa, kapsamı herhangi bir programdaki türetilmiş sınıfın sınıf gövdesine genişletilir.

Yapılar

Yapılar , öğesinden System.ValueTypedevralan değer türleridir. Yapılar, veri üyelerini ve işlev üyelerini içerebilen veri yapılarını temsil eden sınıflara benzer. Ancak sınıflardan farklı olarak yapılar yığın ayırma gerektirmez.

StructureDeclaration
    : Attributes? StructureModifier* 'Structure' Identifier
      TypeParameterList? StatementTerminator
      TypeImplementsClause*
      StructMemberDeclaration*
      'End' 'Structure' StatementTerminator
    ;

StructureModifier
    : TypeModifier
    | 'Partial'
    ;

Sınıflar söz konusu olduğunda, iki değişkenin aynı nesneye başvurması ve bu nedenle bir değişkendeki işlemlerin diğer değişken tarafından başvuruda bulunan nesneyi etkilemesi mümkündür. Yapılarla, değişkenlerin her biri veri olmayanShared verilerin kendi kopyasına sahiptir, bu nedenle aşağıdaki örnekte gösterildiği gibi bir üzerindeki işlemlerin diğerini etkilemesi mümkün değildir:

Structure Point
    Public x, y As Integer

    Public Sub New(x As Integer, y As Integer)
        Me.x = x
        Me.y = y
    End Sub
End Structure

Yukarıdaki bildirime göre aşağıdaki kod değerini 10verir:

Module Test
    Sub Main()
        Dim a As New Point(10, 10)
        Dim b As Point = a

        a.x = 100
        Console.WriteLine(b.x)
    End Sub
End Module

öğesinin ataması a değerin bir kopyasını oluşturur ve b bu nedenle atamadan betkilenmez.a.x Bunun Point yerine sınıf olarak bildirilmiş olsaydı, çıkış nedeni 100 ve a aynı nesneye başvurması olurdub.

Yapı Üyeleri

Bir yapının üyeleri, yapısı üye bildirimleri tarafından tanıtılan üyeler ve öğesinden devralınan System.ValueTypeüyelerdir.

StructMemberDeclaration
    : NonModuleDeclaration
    | VariableMemberDeclaration
    | ConstantMemberDeclaration
    | EventMemberDeclaration
    | MethodMemberDeclaration
    | PropertyMemberDeclaration
    | ConstructorMemberDeclaration
    | OperatorDeclaration
    ;

Her yapı örtük olarak, yapının varsayılan değerini üreten parametresiz bir Public örnek oluşturucuya sahiptir. Sonuç olarak, bir yapı türü bildiriminin parametresiz örnek oluşturucu bildirmesi mümkün değildir. Ancak aşağıdaki örnekte olduğu gibi bir yapı türünün parametreli örnek oluşturucuları bildirmesine izin verilir:

Structure Point
    Private x, y As Integer

    Public Sub New(x As Integer, y As Integer)
        Me.x = x
        Me.y = y
    End Sub
End Structure

Yukarıdaki bildirime göre, aşağıdaki deyimler hem ile Pointx oluşturur hem y de sıfıra başlatılır.

Dim p1 As Point = New Point()
Dim p2 As Point = New Point(0, 0)

Yapılar doğrudan alan değerlerini içerdiğinden (bu değerlere başvurular yerine), yapılar doğrudan veya dolaylı olarak kendilerine başvuran alanlar içeremez. Örneğin, aşağıdaki kod geçerli değil:

Structure S1
    Dim f1 As S2
End Structure

Structure S2
    ' This would require S1 to contain itself.
    Dim f1 As S1
End Structure

Normalde, yapı üyesi bildiriminde yalnızca , veya erişimi olabilir, ancak öğesinden devralınan ObjectProtected üyeler geçersiz kılındığında ve Protected Friend erişim de kullanılabilir.PrivateFriendPublic Yapı üyesi bildirimi bir erişim değiştiricisi içermediğinde, bildirim varsayılan olarak erişime sahip olur Public . Bir yapı tarafından bildirilen bir üyenin kapsamı, bildirimin gerçekleştiği yapı gövdesi ve bu yapının kısıtlamalarıdır (genelse ve kısıtlamaları varsa).

Standart Modüller

Standart modül, üyeleri yalnızca standart modül bildiriminin kendisi yerine standart modülün ad alanını içeren bildirim alanıyla örtük olarak Shared kapsanan bir türdür. Standart modüller hiçbir zaman örneklenemez. Standart modül türünün değişkenini bildirmek bir hatadır.

ModuleDeclaration
    : Attributes? TypeModifier* 'Module' Identifier StatementTerminator
      ModuleMemberDeclaration*
      'End' 'Module' StatementTerminator
    ;

Standart modülün bir üyesi, biri standart modül adı ve diğeri standart modül adı olmayan iki tam ada sahiptir. Ad alanında birden fazla standart modül belirli bir ada sahip bir üye tanımlayabilir; herhangi bir modülün dışındaki ada nitelenmemiş başvurular belirsizdir. Örneğin:

Namespace N1
    Module M1
        Sub S1()
        End Sub

        Sub S2()
        End Sub
    End Module

    Module M2
        Sub S2()
        End Sub
    End Module

    Module M3
        Sub Main()
            S1()       ' Valid: Calls N1.M1.S1.
            N1.S1()    ' Valid: Calls N1.M1.S1.
            S2()       ' Not valid: ambiguous.
            N1.S2()    ' Not valid: ambiguous.
            N1.M2.S2() ' Valid: Calls N1.M2.S2.
        End Sub
    End Module
End Namespace

Modül yalnızca ad alanında bildirilebilir ve başka bir türde iç içe yerleştirilmeyebilir. Standart modüller arabirimleri uygulamayabilir, örtük olarak 'den Objecttüretilir ve yalnızca Shared oluşturucuları vardır.

Standart Modül Üyeleri

Standart modülün üyeleri, üye bildirimleri tarafından tanıtılan üyeler ve öğesinden devralınan Objectüyelerdir. Standart modüllerin örnek oluşturucuları dışında herhangi bir üye türü olabilir. Tüm standart modül türü üyeleri örtük olarak Sharedkullanılır.

ModuleMemberDeclaration
    : NonModuleDeclaration
    | VariableMemberDeclaration
    | ConstantMemberDeclaration
    | EventMemberDeclaration
    | MethodMemberDeclaration
    | PropertyMemberDeclaration
    | ConstructorMemberDeclaration
    ;

Normalde standart modül üyesi bildiriminde yalnızca , veya erişimi olabilir, ancak öğesinden devralınan ObjectProtected üyeler geçersiz kılındığında ve Protected Friend erişim değiştiricileri belirtilebilir.PrivateFriendPublic Standart modül üyesi bildirimi bir erişim değiştiricisi içermediğinde, varsayılan olarak erişime sahip olan bir değişken olmadığı sürece bildirim Public varsayılan olarak erişim olarak Private ayarlanır.

Daha önce belirtildiği gibi, standart modül üyesinin kapsamı standart modül bildirimini içeren bildirimdir. öğesinden devralınan Object üyeler bu özel kapsam kapsamına dahil değildir; bu üyelerin kapsamı yoktur ve her zaman modülün adıyla nitelenmelidir. Üyenin Friend erişimi varsa, kapsamı yalnızca erişim verilen Friend aynı programda veya derlemelerde bildirilen ad alanı üyelerine genişletir.

Arayüzler

Arabirimler , diğer türlerin belirli yöntemleri desteklediğini garanti etmek için uyguladığı başvuru türleridir. Bir arabirim hiçbir zaman doğrudan oluşturulmaz ve gerçek gösterimi yoktur; diğer türlerin arabirim türüne dönüştürülmesi gerekir. Arabirim bir sözleşme tanımlar. Bir arabirimi uygulayan bir sınıf veya yapı kendi sözleşmesine bağlı kalmalıdır.

InterfaceDeclaration
    : Attributes? TypeModifier* 'Interface' Identifier
      TypeParameterList? StatementTerminator
      InterfaceBase*
      InterfaceMemberDeclaration*
      'End' 'Interface' StatementTerminator
    ;

Aşağıdaki örnekte, varsayılan özelliği Item, olayı E, yöntemi Fve özelliği içeren bir arabirim gösterilmektedir P:

Interface IExample
    Default Property Item(index As Integer) As String

    Event E()

    Sub F(value As Integer)

    Property P() As String
End Interface

Arabirimler birden çok devralma içerebilir. Aşağıdaki örnekte, arabirimi IComboBox hem hem de ITextBoxIListBoxöğesinden devralır:

Interface IControl
    Sub Paint()
End Interface 

Interface ITextBox
    Inherits IControl

    Sub SetText(text As String)
End Interface 

Interface IListBox
    Inherits IControl

    Sub SetItems(items() As String)
End Interface 

Interface IComboBox
    Inherits ITextBox, IListBox 
End Interface

Sınıflar ve yapılar birden çok arabirim uygulayabilir. Aşağıdaki örnekte, sınıfı EditBox sınıfından Control türetilir ve hem IDataBoundhem de IControl uygular:

Interface IDataBound
    Sub Bind(b As Binder)
End Interface 

Public Class EditBox
    Inherits Control
    Implements IControl, IDataBound

    Public Sub Paint() Implements IControl.Paint
        ...
    End Sub

    Public Sub Bind(b As Binder) Implements IDataBound.Bind
        ...
    End Sub
End Class

Arabirim Kalıtımı

Bir arabirimin temel arabirimleri açık temel arabirimler ve bunların temel arabirimleridir. Başka bir deyişle, temel arabirim kümesi, açık temel arabirimlerin, bunların açık temel arabirimlerinin vb. tam geçişli kapanışıdır. Arabirim bildiriminde açık arabirim temeli yoksa, türü için temel arabirim yoktur; arabirimler öğesinden Object devralılmaz (genişletme dönüştürmesine Objectsahip olsalar da).

InterfaceBase
    : 'Inherits' InterfaceBases StatementTerminator
    ;

InterfaceBases
    : NonArrayTypeName ( Comma NonArrayTypeName )*
    ;

Aşağıdaki örnekte, temel arabirimleri IComboBox , ITextBoxve IListBoxşeklindedirIControl.

Interface IControl
    Sub Paint()
End Interface 

Interface ITextBox
    Inherits IControl

    Sub SetText(text As String)
End Interface 

Interface IListBox
    Inherits IControl

    Sub SetItems(items() As String)
End Interface 

Interface IComboBox
    Inherits ITextBox, IListBox 
End Interface

Arabirim, temel arabirimlerinin tüm üyelerini devralır. Başka bir deyişle, yukarıdaki IComboBox arabirimi SetText, SetItems ve Paint gibi üyeleri devralır.

Bir arabirimi uygulayan bir sınıf veya yapı, arabirimin tüm temel arabirimlerini de örtük olarak uygular.

Temel arabirimlerin geçişli kapanışında bir arabirim birden çok kez görünürse, üyelerini türetilmiş arabirime yalnızca bir kez katkıda bulunur. Türetilmiş arabirimi uygulayan bir türün, çarpma tanımlı temel arabiriminin yöntemlerini yalnızca bir kez uygulaması gerekir. Aşağıdaki örnekte, Paint sınıfı ve IControluygulasa bile yalnızca bir kez uygulanması IComboBox gerekir.

Class ComboBox
    Implements IControl, IComboBox

    Sub SetText(text As String) Implements IComboBox.SetText
    End Sub

    Sub SetItems(items() As String) Implements IComboBox.SetItems
    End Sub

    Sub Print() Implements IComboBox.Paint
    End Sub
End Class

Yan Inherits tümcenin diğer Inherits yan tümceler üzerinde hiçbir etkisi yoktur. Aşağıdaki örnekte, IDerived öğesinin adını INested ile IBasenitelemelidir.

Interface IBase
    Interface INested
        Sub Nested()
    End Interface

    Sub Base()
End Interface

Interface IDerived
    Inherits IBase, INested   ' Error: Must specify IBase.INested.
End Interface

Temel arabirimin erişilebilirlik etki alanı, arabirimin kendi erişilebilirlik etki alanıyla aynı veya üst kümesi olmalıdır.

Arabirim Üyeleri

Bir arabirimin üyeleri, üye bildirimleri tarafından tanıtılan üyelerden ve temel arabirimlerinden devralınan üyelerden oluşur.

InterfaceMemberDeclaration
    : NonModuleDeclaration
    | InterfaceEventMemberDeclaration
    | InterfaceMethodMemberDeclaration
    | InterfacePropertyMemberDeclaration
    ;

Arabirim uygulayan her sınıf veya yapı öğesinden devralmadığından, arabirimler öğesinden ObjectObjectüyeleri devralmasa da, uzantı yöntemleri de dahil olmak üzere öğesinin Objectüyeleri bir arabirimin üyesi olarak kabul edilir ve bir arabirimde doğrudan için atama Objectgerektirmeden çağrılabilir. Örneğin:

Interface I1
End Interface

Class C1
    Implements I1
End Class

Module Test
    Sub Main()
        Dim i As I1 = New C1()
        Dim h As Integer = i.GetHashCode()
    End Sub
End Module

Örtük olarak gölge Object üyelerin üyeleriyle aynı ada sahip bir arabirimin Object üyeleri. Yalnızca iç içe türler, yöntemler, özellikler ve olaylar bir arabirimin üyesi olabilir. Yöntemlerin ve özelliklerin gövdesi olmayabilir. Arabirim üyeleri örtük olarak Public bulunur ve bir erişim değiştirici belirtmeyebilir. Bir arabirimde bildirilen bir üyenin kapsamı, bildirimin gerçekleştiği arabirim gövdesinin yanı sıra bu arabirimin kısıtlama listesidir (genelse ve kısıtlamaları varsa).

Diziler

Dizi, dizideki değişkenlerin sırasına göre bire bir karşılık gelen dizinler aracılığıyla erişilen değişkenleri içeren bir başvuru türüdür. Dizinin öğeleri olarak da adlandırılan bir dizideki değişkenlerin tümü aynı türde olmalıdır ve bu tür dizinin öğe türü olarak adlandırılır.

ArrayTypeName
    : NonArrayTypeName ArrayTypeModifiers
    ;

ArrayTypeModifiers
    : ArrayTypeModifier+
    ;

ArrayTypeModifier
    : OpenParenthesis RankList? CloseParenthesis
    ;

RankList
    : Comma*
    ;

ArrayNameModifier
    : ArrayTypeModifiers
    | ArraySizeInitializationModifier
    ;

Dizi örneği oluşturulduğunda dizinin öğeleri ortaya çıkar ve dizi örneği yok edildiğinde yok olur. Bir dizinin her öğesi, türünün varsayılan değerine başlatılır. Tür System.Array , tüm dizi türlerinin temel türüdür ve örneği oluşturulamayabilir. Her dizi türü, türü tarafından System.Array bildirilen üyeleri devralır ve buna (ve Object) dönüştürülebilir. öğesiyle T tek boyutlu bir dizi türü de arabirimleri System.Collections.Generic.IList(Of T) uygular ve IReadOnlyList(Of T)bir başvuru türüyseT, dizi türü de ve IReadOnlyList(Of U) 'den Tgenişleyen başvuru dönüştürmesi olan herhangi U biri için de uygularIList(Of U).

Bir dizi, her dizi öğesiyle ilişkili dizin sayısını belirleyen bir dereceye sahiptir. Dizinin derecesi, dizinin boyut sayısını belirler. Örneğin, bir derecesine sahip bir diziye tek boyutlu dizi, birden büyük dereceye sahip bir dizi ise çok boyutlu dizi olarak adlandırılır.

Aşağıdaki örnek, tamsayı değerlerinden oluşan tek boyutlu bir dizi oluşturur, dizi öğelerini başlatır ve sonra bunların her birini yazdırır:

Module Test
    Sub Main()
        Dim arr(5) As Integer
        Dim i As Integer

        For i = 0 To arr.Length - 1
            arr(i) = i * i
        Next i

        For i = 0 To arr.Length - 1
            Console.WriteLine("arr(" & i & ") = " & arr(i))
        Next i
    End Sub
End Module

Program aşağıdaki çıkışları oluşturur:

arr(0) = 0
arr(1) = 1
arr(2) = 4
arr(3) = 9
arr(4) = 16
arr(5) = 25

Bir dizinin her boyutu ilişkili bir uzunluğa sahiptir. Boyut uzunlukları, dizi türünün bir parçası değildir, bunun yerine çalışma zamanında dizi türünün bir örneği oluşturulduğunda oluşturulur. Bir boyutun uzunluğu, bu boyut için geçerli dizin aralığını belirler: uzunluk Nboyutu için, dizinler sıfırdan N-1öğesine kadar değişebilir. Boyut sıfır uzunluktaysa, bu boyut için geçerli dizin yoktur. Dizideki öğelerin toplam sayısı, dizideki her boyutun uzunluklarının çarpımını gösterir. Bir dizinin boyutlarından herhangi birinin uzunluğu sıfırsa, dizinin boş olduğu söylenir. Bir dizinin öğe türü herhangi bir tür olabilir.

Dizi türleri, var olan bir tür adına değiştirici eklenerek belirtilir. Değiştirici bir sol parantez, sıfır veya daha fazla virgül kümesi ve sağ parantezden oluşur. Değiştirilen tür dizinin öğe türüdür ve boyut sayısı virgül artı bir sayısıdır. Birden fazla değiştirici belirtilirse, dizinin öğe türü bir dizidir. Değiştiriciler soldan sağa okunur ve en soldaki değiştirici en dıştaki dizi olur. Örnekte

Module Test
    Dim arr As Integer(,)(,,)()
End Module

öğesinin arr öğe türü, bir boyutlu dizilerinin üç boyutlu dizilerinden oluşan iki boyutlu bir dizidir Integer.

Değişken adına dizi türü değiştirici veya dizi boyutu başlatma değiştiricisi koyarak bir değişkenin dizi türünde olduğu da bildirilebilir. Bu durumda, dizi öğesi türü bildirimde verilen türdür ve dizi boyutları değişken adı değiştiricisi tarafından belirlenir. Netlik için, aynı bildirimde hem değişken adında hem de tür adında dizi türü değiştiricisi olması geçerli değildir.

Aşağıdaki örnekte, öğe türü olarak ile Integer dizi türlerini kullanan çeşitli yerel değişken bildirimleri gösterilmektedir:

Module Test
    Sub Main()
        Dim a1() As Integer    ' Declares 1-dimensional array of integers.
        Dim a2(,) As Integer   ' Declares 2-dimensional array of integers.
        Dim a3(,,) As Integer  ' Declares 3-dimensional array of integers.

        Dim a4 As Integer()    ' Declares 1-dimensional array of integers.
        Dim a5 As Integer(,)   ' Declares 2-dimensional array of integers.
        Dim a6 As Integer(,,)  ' Declares 3-dimensional array of integers.

        ' Declare 1-dimensional array of 2-dimensional arrays of integers 
        Dim a7()(,) As Integer
        ' Declare 2-dimensional array of 1-dimensional arrays of integers.
        Dim a8(,)() As Integer

        Dim a9() As Integer() ' Not allowed.
    End Sub
End Module

Dizi türü adı değiştirici, onu izleyen tüm parantez kümelerine genişletir. Başka bir deyişle, bir tür adından sonra parantez içine alınmış bir dizi bağımsız değişkene izin verildiğinde, dizi türü adı için bağımsız değişkenlerin belirtilmesi mümkün değildir. Örneğin:

Module Test
    Sub Main()
        ' This calls the Integer constructor.
        Dim x As New Integer(3)

        ' This declares a variable of Integer().
        Dim y As Integer()

        ' This gives an error.
        ' Array sizes can not be specified in a type name.
        Dim z As Integer()(3)
    End Sub
End Module

Son durumda, (3) oluşturucu bağımsız değişkenleri kümesi olarak değil tür adının bir parçası olarak yorumlanır.

Temsilciler

Temsilci, bir tür yöntemine veya bir Shared nesnenin örnek yöntemine başvuran bir başvuru türüdür.

DelegateDeclaration
    : Attributes? TypeModifier* 'Delegate' MethodSignature StatementTerminator
    ;

MethodSignature
    : SubSignature
    | FunctionSignature
    ;

Diğer dillerdeki bir temsilcinin en yakın eşdeğeri bir işlev işaretçisidir, ancak işlev işaretçisi yalnızca işlevlere başvurabilirken Shared , temsilci hem hem de Shared örnek yöntemlerine başvurabilir. İkinci durumda, temsilci yalnızca yöntemin giriş noktasına bir başvuru değil, aynı zamanda yönteminin çağrılacağı nesne örneğine de başvuru depolar.

Temsilci bildiriminin yan Handles tümcesi, yan Implements tümcesi, yöntem gövdesi veya yapısı End olmayabilir. Temsilci bildiriminin parametre listesi veya ParamArray parametreleri içermeyebilirOptional. Dönüş türünün ve parametre türlerinin erişilebilirlik etki alanı, temsilcinin erişilebilirlik etki alanıyla veya üst kümesiyle aynı olmalıdır.

Bir temsilcinin üyeleri sınıfından System.Delegatedevralınan üyelerdir. Temsilci aşağıdaki yöntemleri de tanımlar:

  • Biri türünde, diğeri System.IntPtrtüründe Object olmak üzere iki parametre alan bir oluşturucu.

  • Temsilciyle Invoke aynı imzaya sahip bir yöntem.

  • BeginInvoke İmzası temsilci imzası olan ve üç farklılığı olan bir yöntem. İlk olarak, dönüş türü olarak System.IAsyncResultdeğiştirilir. İkincisi, parametre listesinin sonuna iki ek parametre eklenir: türünün System.AsyncCallback ilki ve türünün ikinci parametresi Object. Son olarak, tüm ByRef parametreler olarak ByValdeğiştirilir.

  • EndInvoke Dönüş türü temsilciyle aynı olan bir yöntem. yönteminin parametreleri, yalnızca tam olarak parametre olan temsilci parametreleridir ByRef ve temsilci imzasında aynı sırada yer alır. Bu parametrelere ek olarak, parametre listesinin sonunda ek bir tür System.IAsyncResult parametresi vardır.

Temsilcileri tanımlamanın ve kullanmanın üç adımı vardır: bildirim, örnekleme ve çağırma.

Temsilciler, temsilci bildirimi söz dizimi kullanılarak bildirilir. Aşağıdaki örnek, bağımsız değişken içermeyen adlı SimpleDelegate bir temsilci bildirir:

Delegate Sub SimpleDelegate()

Sonraki örnekte bir SimpleDelegate örnek oluşturulur ve hemen çağrılır:

Module Test
    Sub F()
        System.Console.WriteLine("Test.F")
    End Sub 

    Sub Main()
        Dim d As SimpleDelegate = AddressOf F
        d()
    End Sub 
End Module

Bir yöntem için temsilci örneği oluşturmanın ve ardından doğrudan yöntemi çağırmak daha kolay olacağından temsilci aracılığıyla hemen çağrı yapmanın pek bir anlamı yoktur. Temsilciler, anonimlikleri kullanıldığında yararlılıklarını gösterir. Sonraki örnekte bir örneği tekrar tekrar çağıran bir SimpleDelegate yöntem gösterilmektedirMultiCall:

Sub MultiCall(d As SimpleDelegate, count As Integer)
    Dim i As Integer

    For i = 0 To count - 1
        d()
    Next i
End Sub

yöntemi için hedef yöntemin MultiCall ne olduğu, bu yöntemin SimpleDelegate hangi erişilebilirliğe sahip olduğu veya yöntemin Shared olup olmadığı önemli değildir. Önemli olan tek şey hedef yöntemin imzasının ile SimpleDelegateuyumlu olmasıdır.

Kısmi türler

Sınıf ve yapı bildirimleri kısmi bildirimler olabilir. Kısmi bir bildirim, bildirim içinde bildirilen türü tam olarak açıklıyor veya tanımlanmayabilir. Bunun yerine, türün bildirimi program içindeki birden çok kısmi bildirime yayılabilir; kısmi türler program sınırları arasında bildirilemez. Kısmi tür bildirimi, bildirimdeki Partial değiştiriciyi belirtir. Ardından, aynı tam ada sahip bir tür için programdaki diğer tüm bildirimler, tek bir tür bildirimi oluşturmak için derleme zamanında kısmi bildirimle birleştirilir. Örneğin, aşağıdaki kod ve Test.C2üyeleriyle Test.C1 tek bir sınıf Test bildirir.

a.vb:

Public Partial Class Test
    Public Sub S1()
    End Sub
End Class

b.vb:

Public Class Test
    Public Sub S2()
    End Sub
End Class

Kısmi tür bildirimlerini birleştirirken, bildirimlerden en az birinin değiştiricisi olmalıdır, aksi takdirde derleme zamanı hata sonuçları.Partial

Not. Birçok kısmi bildirim arasında yalnızca bir bildirimde belirtmek Partial mümkün olsa da, tüm kısmi bildirimlerde belirtmek daha iyidir. Bir kısmi bildirimin görünür olduğu ancak bir veya daha fazla kısmi bildirimin gizlendiği durumlarda (araç tarafından oluşturulan kodu genişletme gibi), değiştiriciyi Partial görünür bildirimin dışında bırakmak ancak gizli bildirimlerde belirtmek kabul edilebilir.

Yalnızca sınıflar ve yapılar kısmi bildirimler kullanılarak bildirilebilir. Bir türün arity değeri, kısmi bildirimleri birlikte eşleştirirken dikkate alınır: aynı ada sahip ancak farklı tür parametrelerine sahip iki sınıf, aynı anda kısmi bildirimler olarak kabul edilmez. Kısmi bildirimler öznitelikleri, sınıf değiştiricileri, Inherits deyimi veya Implements deyimini belirtebilir. Derleme zamanında, kısmi bildirimlerin tüm parçaları birlikte birleştirilir ve tür bildiriminin bir parçası olarak kullanılır. Öznitelikler, değiştiriciler, temeller, arabirimler veya tür üyeleri arasında herhangi bir çakışma varsa, derleme zamanı hata sonuçları. Örneğin:

Public Partial Class Test1
    Implements IDisposable
End Class

Class Test1
    Inherits Object
    Implements IComparable
End Class

Public Partial Class Test2
End Class

Private Partial Class Test2
End Class

Önceki örnek, ve 'den Object devralan ve uygulayan System.IComparableSystem.IDisposable bir tür Test1Publicbildirir. Bildirimlerden biri olduğunu, diğeri ise olduğunu belirttiğinden Test2Public kısmi bildirimleri Test2 derleme zamanı hatasına Test2Privateneden olur.

Tür parametrelerine sahip kısmi türler, tür parametreleri için kısıtlamaları ve varyansı bildirebilir, ancak her kısmi bildirimin kısıtlamaları ve varyansı eşleşmelidir. Bu nedenle kısıtlamalar ve varyans, diğer değiştiriciler gibi otomatik olarak birleştirilmemeleri için özeldir:

Partial Public Class List(Of T As IEnumerable)
End Class

' Error: Constraints on T don't match
Class List(Of T As IComparable)
End Class

Bir türün birden çok kısmi bildirim kullanılarak bildiriliyor olması, tür içindeki ad arama kurallarını etkilemez. Sonuç olarak, kısmi tür bildirimi diğer kısmi tür bildirimlerinde bildirilen üyeleri kullanabilir veya diğer kısmi tür bildirimlerinde bildirilen arabirimlerde yöntemler uygulayabilir. Örneğin:

Public Partial Class Test1
    Implements IDisposable

    Private IsDisposed As Boolean = False
End Class

Class Test1
    Private Sub Dispose() Implements IDisposable.Dispose
        If Not IsDisposed Then
            ...
        End If
    End Sub
End Class

İç içe türlerin kısmi bildirimleri de olabilir. Örneğin:

Public Partial Class Test
    Public Partial Class NestedTest
        Public Sub S1()
        End Sub
    End Class
End Class

Public Partial Class Test
    Public Partial Class NestedTest
        Public Sub S2()
        End Sub
    End Class
End Class

Kısmi bildirim içindeki başlatıcılar bildirim sırasına göre yürütülür; ancak, ayrı kısmi bildirimlerde gerçekleşen başlatıcılar için garantili yürütme sırası yoktur.

Yapılı Türler

Genel tür bildirimi tek başına bir türü göstermez. Bunun yerine genel tür bildirimi, tür bağımsız değişkenleri uygulanarak birçok farklı tür oluşturmak için "şema" olarak kullanılabilir. Tür bağımsız değişkenleri uygulanmış olan genel tür, yapılı tür olarak adlandırılır. Yapılı bir türdeki tür bağımsız değişkenleri her zaman eşleştirildikleri tür parametrelerine yerleştirilen kısıtlamaları karşılamalıdır.

Tür adı, tür parametrelerini doğrudan belirtmese bile, bir tür türü tanımlayabilir. Bu durum, bir türün genel bir sınıf bildirimi içinde iç içe geçtiği ve içeren bildirimin örnek türünün ad araması için örtük olarak kullanıldığı durumlarda oluşabilir:

Class Outer(Of T) 
    Public Class Inner 
    End Class

    ' Type of i is the constructed type Outer(Of T).Inner
    Public i As Inner 
End Class

Genel tür ve tüm tür C(Of T1,...,Tn) bağımsız değişkenleri erişilebilir olduğunda, yapılı bir türe erişilebilir. Örneğin, genel tür C ise Public ve tür bağımsız değişkenlerinin T1,...,Tn tümü ise Public, bu tür oluşturulur Public. Bununla birlikte, tür adı veya tür bağımsız değişkenlerinden biri ise Private, bu durumda, yapısı yapılan türün erişilebilirliği olur Private. Oluşturulmuş türün Protected bir tür bağımsız değişkeni ve başka bir tür bağımsız değişkeni ise Friend, bu derlemede veya erişim verilmiş Friend herhangi bir derlemede, oluşturulmuş türe yalnızca sınıfında ve alt sınıflarında erişilebilir. Başka bir deyişle, bir yapı türü için erişilebilirlik etki alanı, bağlı bölümlerinin erişilebilirlik etki alanlarının kesişimidir.

Not. Yapılandırılmış türün erişilebilirlik etki alanının, kendi oluşturduğu parçaların kesişimi olması, yeni bir erişilebilirlik düzeyi tanımlamanın ilginç yan etkisine sahiptir. olan bir öğeyi Protected ve yalnızca hem hem deFriendProtectedüyelerine erişebilen bağlamlarda erişilebilen bir öğeyi Friend içeren bir yapılı tür. Ancak, bu erişilebilirlik düzeyini dilde ifade etmenin bir yolu yoktur; erişilebilirlikProtected Friend, bir varlığaveyaProtected üyelere erişebilecekFriend bir bağlamda erişilebileceği anlamına gelir.

Temel, uygulanan arabirimler ve oluşturulmuş türlerin üyeleri, genel türdeki tür parametresinin her oluşumu için sağlanan tür bağımsız değişkenleri değiştirilerek belirlenir.

Açık Türler ve Kapalı Türler

Bir veya daha fazla tür bağımsız değişkeninin içeren bir türün veya yöntemin tür parametreleri olduğu için yapılan tür , açık tür olarak adlandırılır. Bunun nedeni türün bazı tür parametrelerinin hala bilinmemesidir, bu nedenle türün gerçek şekli henüz tam olarak bilinmemektedir. Buna karşılık, tür bağımsız değişkenlerinin tümü tür olmayan parametreler olan genel bir türe kapalı tür adı verilir. Kapalı türün şekli her zaman tam olarak bilinir. Örneğin:

Class Base(Of T, V)
End Class

Class Derived(Of V)
    Inherits Base(Of Integer, V)
End Class

Class MoreDerived
    Inherits Derived(Of Double)
End Class

Tür parametresi sağlansa da tür parametresi başka bir tür parametresi TU sağlandığından, yapı türü Base(Of Integer, V) açık bir türdür. Bu nedenle, türün tam şekli henüz bilinmez. Ancak, devralma hiyerarşisindeki tüm tür parametreleri sağlandığından, yapısı Derived(Of Double)yapılmış türü kapalı bir türdür.

Açık türler aşağıdaki gibi tanımlanır:

  • Tür parametresi açık bir türdür.

  • Öğe türü açık bir türse, dizi türü açık bir türdür.

  • Bir veya daha fazla tür bağımsız değişkeni açık bir türse, yapılı tür açık bir türdür.

  • Kapalı tür, açık bir tür olmayan bir türdür.

Program giriş noktası genel bir türde olmadığından, çalışma zamanında kullanılan tüm türler kapatılır.

Özel Türler

.NET Framework, .NET Framework ve Visual Basic dili tarafından özel olarak ele alınan bir dizi sınıf içerir:

.NET Framework'te geçersiz bir türü temsil eden türüne System.Voiddoğrudan yalnızca ifadelerde GetType başvurulabilir.

türleri System.RuntimeArgumentHandleSystem.ArgIterator ve System.TypedReference tümü yığına işaretçiler içerebilir ve bu nedenle .NET Framework yığınında görüntülenemez. Bu nedenle, dizi öğesi türleri, dönüş türleri, alan türleri, genel tür bağımsız değişkenleri, null atanabilir türler, parametre türleri, ByRef veya System.ValueTypeöğesine dönüştürülen Object bir değerin türü, veya System.ValueTypeörnek üyelerine Object yönelik bir çağrının hedefi veya bir kapanışa kaldırılamaz.