Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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,
123ItüründeIntegerbir 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ı) veLong(8 bayt imzalı tamsayı). Bu türler sırasıyla ,System.SByte,System.UInt16,System.Int16,System.UInt32, ,System.UInt64System.Int32veSystem.Int64ile eşlerSystem.Byte. Tamser türünün varsayılan değeri değişmez0değerine eşdeğerdir.Kayan nokta değer türleri
Single(4 baytlık kayan nokta) veDouble(8 baytlık kayan nokta). Bu türler sırasıyla veSystem.DoubleileSystem.Singleeşler. Kayan nokta türünün varsayılan değeri değişmez0değerine eşdeğerdir.Decimalile eşlenenSystem.Decimaltür (16 baytlık ondalık değer). Ondalık değerinin varsayılan değeri değişmez değerle eşdeğerdir0D.Bir
Booleandoğ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ündedirSystem.Boolean. TürünBooleanvarsayılan değeri değişmez değerineFalseeşdeğerdir.Bir
Datetarihi ve/veya saati temsil eden ve ile eşlenenSystem.DateTimedeğer türü. TürünDatevarsayılan değeri değişmez değerine# 01/01/0001 12:00:00AM #eşdeğerdir.Tek
Charbir Unicode karakterini temsil eden ve ileSystem.Chareşlenen değer türü. türünün varsayılan değeriCharsabit ifadesineChrW(0)eşdeğerdir.Bir
StringUnicode karakter dizisini temsil eden ve ileSystem.Stringeşlenen başvuru türü. TürünStringvarsayı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
Redotomatik olarak atanır0(başlatıcısı olmadığından ve ilk numaralandırma değeri üyesi olduğundan).Numaralandırma değerine
Greenaçıkça değeri10verilir.Numaralandırma değerine
Blueotomatik 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ündeObjectolmak üzere iki parametre alan bir oluşturucu.Temsilciyle
Invokeaynı imzaya sahip bir yöntem.BeginInvokeİmzası temsilci imzası olan ve üç farklılığı olan bir yöntem. İlk olarak, dönüş türü olarakSystem.IAsyncResultdeğiştirilir. İkincisi, parametre listesinin sonuna iki ek parametre eklenir: türününSystem.AsyncCallbackilki ve türünün ikinci parametresiObject. Son olarak, tümByRefparametreler olarakByValdeğiştirilir.EndInvokeDönüş türü temsilciyle aynı olan bir yöntem. yönteminin parametreleri, yalnızca tam olarak parametre olan temsilci parametreleridirByRefve temsilci imzasında aynı sırada yer alır. Bu parametrelere ek olarak, parametre listesinin sonunda ek bir türSystem.IAsyncResultparametresi 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.
Visual Basic language spec