Aracılığıyla paylaş


Kaynak Dosyalar ve Ad Alanları

Visual Basic programı bir veya daha fazla kaynak dosyadan oluşur. Bir program derlendiğinde, tüm kaynak dosyalar birlikte işlenir; bu nedenle, kaynak dosyalar ileriye dönük bildirim gereksinimi olmadan büyük olasılıkla döngüsel bir şekilde birbirine bağımlı olabilir. Program metnindeki bildirimlerin metinsel sırası genellikle anlamlı değildir.

Kaynak dosya isteğe bağlı bir seçenek deyimleri, içeri aktarma deyimleri ve öznitelik kümesinden oluşur ve bunu bir ad alanı gövdesi izler. Her birinin veya Module değiştiricisine Assembly sahip olması gereken öznitelikler, derleme tarafından üretilen .NET derlemesine veya modülüne uygulanır. Kaynak dosyanın gövdesi, genel ad alanı için örtük bir ad alanı bildirimi olarak işlev görür; başka bir deyişle, kaynak dosyanın en üst düzeyindeki tüm bildirimler genel ad alanına yerleştirilir. Örneğin:

FileA.vb:

Class A
End Class

FileB.vb:

Class B
End Class

İki kaynak dosyası, genel ad alanına katkıda bulunur ve bu durumda tam adı A ve Bolan iki sınıfı bildirir. İki kaynak dosya aynı bildirim alanına katkıda bulunduğundan, her biri aynı ada sahip bir üye bildirimi içeriyorsa hata olurdu.

Not. Derleme ortamı, bir kaynak dosyanın örtük olarak yerleştirildiği ad alanı bildirimlerini geçersiz kılabilir.

Not edilen durumlar dışında, Visual Basic programı içindeki deyimler bir satır sonlandırıcısı veya iki nokta üst üste ile sonlandırılabilir.

Start
    : OptionStatement* ImportsStatement* AttributesStatement* NamespaceMemberDeclaration*
    ;

StatementTerminator
    : LineTerminator
    | ':'
    ;

AttributesStatement
    : Attributes StatementTerminator
    ;

Program Başlatma ve Sonlandırma

Program başlatma, yürütme ortamı programın giriş noktası olarak adlandırılan belirlenmiş bir yöntemi yürüttüğünde gerçekleşir. Her zaman olarak adlandırılmış Mainolması gereken bu giriş noktası yöntemi paylaşılmalıdır, genel bir türde bulunamaz, zaman uyumsuz değiştiriciye sahip olamaz ve aşağıdaki imzalardan birine sahip olmalıdır:

Sub Main()
Sub Main(args() As String)
Function Main() As Integer
Function Main(args() As String) As Integer

Giriş noktası yönteminin erişilebilirliği ilgisizdir. Bir program birden fazla uygun giriş noktası içeriyorsa, derleme ortamının giriş noktası olarak bir tane belirlemesi gerekir. Aksi takdirde derleme zamanı hatası oluşur. Derleme ortamı, yoksa bir giriş noktası yöntemi de oluşturabilir.

Bir program başladığında, giriş noktasının bir parametresi varsa, yürütme ortamı tarafından sağlanan bağımsız değişken, dize olarak temsil edilen programın komut satırı bağımsız değişkenlerini içerir. Giriş noktasının dönüş türü Integerise, işlevden döndürülen değer programın sonucu olarak yürütme ortamına döndürülür.

Diğer tüm açılardan, giriş noktası yöntemleri diğer yöntemlerle aynı şekilde davranır. Yürütme, yürütme ortamı tarafından yapılan giriş noktası yönteminin çağrısını bıraktığında program sonlandırılır.

Derleme Seçenekleri

Kaynak dosya, seçenek deyimlerini kullanarak kaynak kodda derleme seçeneklerini belirtebilir.

OptionStatement
    : OptionExplicitStatement
    | OptionStrictStatement
    | OptionCompareStatement
    | OptionInferStatement
    ;

Deyim Option yalnızca içinde göründüğü kaynak dosyaya uygulanır ve her deyim türünden Option yalnızca biri bir kaynak dosyada görüntülenebilir. Örneğin:

Option Strict On
Option Compare Text
Option Strict Off    ' Not allowed, Option Strict is already specified.
Option Compare Text  ' Not allowed, Option Compare is already specified.

Dört derleme seçeneği vardır: katı tür semantiği, açık bildirim semantiği, karşılaştırma semantiği ve yerel değişken türü çıkarım semantiği. Kaynak dosya belirli Option bir deyimi içermiyorsa, derleme ortamı hangi semantik kümesinin kullanılacağını belirler. Ayrıca, yalnızca derleme ortamı aracılığıyla belirtilebilen beşinci bir derleme seçeneği de vardır. Tamsayı taşması denetimleri.

Option Explicit Deyimi

deyimi Option Explicit , yerel değişkenlerin örtük olarak bildirilip bildirilemeyeceğini belirler. anahtar sözcükler On veya Off deyimini izleyebilir; hiçbiri belirtilmezse, varsayılan değer olur On. Bir dosyada herhangi bir deyim belirtilmezse, hangisinin kullanılacağını derleme ortamı belirler.

OptionExplicitStatement
    : 'Option' 'Explicit' OnOff? StatementTerminator
    ;

OnOff
    : 'On' | 'Off'
    ;

Not. Explicit ve Off ayrılmış sözcükler değildir.

Option Explicit Off

Module Test
    Sub Main()
        x = 5 ' Valid because Option Explicit is off.
    End Sub
End Module

Bu örnekte, yerel değişkene x atanarak örtük olarak bildirilir. x türü Object'dir.

Option Strict Deyimi

deyimi, Option Strict üzerindeki Object dönüştürmelerin ve işlemlerin katı veya izin veren tür semantiği tarafından yönetilip yönetilmeyeceğini ve türlerin örtük olarak hiçbir As yan tümce belirtilmemiş gibi Object yazılıp yazılmayacağını belirler. Deyiminin ardından anahtar sözcükler On gelebilir veya Offhiçbiri belirtilmezse, varsayılan değer olur On. Bir dosyada herhangi bir deyim belirtilmezse, hangisinin kullanılacağını derleme ortamı belirler.

OptionStrictStatement
    : 'Option' 'Strict' OnOff? StatementTerminator
    ;

Not. Strict ve Off ayrılmış sözcükler değildir.

Option Strict On

Module Test
    Sub Main()
        Dim x ' Error, no type specified.
        Dim o As Object
        Dim b As Byte = o ' Error, narrowing conversion.

        o.F() ' Error, late binding disallowed.
        o = o + 1 ' Error, addition is not defined on Object.
    End Sub
End Module

Katı semantikler altında aşağıdakilere izin verilmez:

  • Açık bir atama işleci olmadan dönüştürmeleri daraltma.

  • Geç bağlama.

  • ...Is, Isve IsNotdışındaki TypeOftürdeki Object işlemler.

  • Çıkarım türü As olmayan bir bildirimde yan tümcesini atlar.

Option Compare Deyimi

deyimi Option Compare , dize karşılaştırmalarının semantiğini belirler. Dize karşılaştırmaları, ikili karşılaştırmalar (her karakterin ikili Unicode değerinin karşılaştırıldığı) veya metin karşılaştırmaları (her karakterin sözcüksel anlamının geçerli kültür kullanılarak karşılaştırıldığı) kullanılarak gerçekleştirilir. Bir dosyada herhangi bir deyim belirtilmezse, derleme ortamı hangi karşılaştırma türünün kullanılacağını denetler.

OptionCompareStatement
    : 'Option' 'Compare' CompareOption StatementTerminator
    ;

CompareOption
    : 'Binary' | 'Text'
    ;

Not.Compare, Binaryve Text ayrılmış sözcükler değildir.

Option Compare Text

Module Test
    Sub Main()
        Console.WriteLine("a" = "A")    ' Prints True.
    End Sub
End Module

Bu durumda dize karşılaştırması, büyük/küçük harf farklarını yoksayan bir metin karşılaştırması kullanılarak yapılır. Belirtilmiş olsaydı Option Compare Binary , bu yazdırılırdı False.

Tamsayı Taşma Denetimleri

Tamsayı işlemleri, çalışma zamanında taşma koşulları için denetlenebilir veya denetlenemez. Taşma koşulları denetlenirse ve bir tamsayı işlemi taşıyorsa, bir System.OverflowException özel durum oluşturulur. Taşma koşulları işaretlenmezse, tamsayı işlem taşması özel durum oluşturmaz. Derleme ortamı bu seçeneğin açık mı yoksa kapalı mı olduğunu belirler.

Option Infer Deyimi

deyimi, Option Infer yan tümcesi olmayan As yerel değişken bildirimlerinin çıkarımlı bir türe sahip olup olmadığını veya kullanıp kullanmadığını Objectbelirler. Deyiminin ardından anahtar sözcükler On gelebilir veya Offhiçbiri belirtilmezse, varsayılan değer olur On. Bir dosyada herhangi bir deyim belirtilmezse, hangisinin kullanılacağını derleme ortamı belirler.

OptionInferStatement
    : 'Option' 'Infer' OnOff? StatementTerminator
    ;

Not. Infer ve Off ayrılmış sözcükler değildir.

Option Infer On

Module Test
    Sub Main()
        ' The type of x is Integer
        Dim x = 10

        ' The type of y is String
        Dim y = "abc"
    End Sub
End Module

Imports Deyimi

Imports deyimleri, varlıkların adlarını bir kaynak dosyaya aktararak adlara niteleme olmadan başvurulmasına izin verir veya XML ifadelerinde kullanmak üzere bir ad alanını içeri aktarır.

ImportsStatement
    : 'Imports' ImportsClauses StatementTerminator
    ;

ImportsClauses
    : ImportsClause ( Comma ImportsClause )*
    ;

ImportsClause
    : AliasImportsClause
    | MembersImportsClause
    | XMLNamespaceImportsClause
    ;

Bir deyimi içeren Imports bir kaynak dosyadaki üye bildirimleri içinde, aşağıdaki örnekte görüldüğü gibi, verilen ad alanında yer alan türlere doğrudan başvurulabilir:

Imports N1.N2

Namespace N1.N2
    Class A
    End Class
End Namespace 

Namespace N3
    Class B
        Inherits A
    End Class
End Namespace

Burada, kaynak dosyada ad alanının N1.N2 tür üyeleri doğrudan kullanılabilir ve bu nedenle sınıfı N3.B sınıfından N1.N2.Atüretilir.

Imports deyimleri herhangi bir Option deyimden sonra ancak herhangi bir tür bildirimi öncesinde görünmelidir. Derleme ortamı örtük Imports deyimleri de tanımlayabilir.

Imports deyimleri, adları bir kaynak dosyada kullanılabilir hale getirir, ancak genel ad alanının bildirim alanında hiçbir şey bildirmez. Bir Imports deyimi tarafından içeri aktarılan adların kapsamı, kaynak dosyada yer alan ad alanı üye bildirimlerinin kapsamını genişletir. Bir deyiminin Imports kapsamı özellikle diğer Imports deyimleri içermez ve diğer kaynak dosyaları içermez. Imports deyimleri birbirine başvuramayabilir.

Bu örnekte, ilk içeri aktarma diğer adı etkilenmediğinden son Imports deyim hatalıdır.

Imports R1 = N1 ' OK.
Imports R2 = N1.N2 ' OK.
Imports R3 = R1.N2 ' Error: Can't refer to R1.

Namespace N1.N2
End Namespace

Not. Deyimlerde Imports görüntülenen ad alanı veya tür adları her zaman tam nitelenmiş gibi değerlendirilir. Yani, ad alanı veya tür adında en soldaki tanımlayıcı her zaman genel ad alanında çözümlenir ve çözümlemenin geri kalanı normal ad çözümleme kurallarına göre devam eder. Bu, dilde böyle bir kural uygulayan tek yerdir; kural, bir adın nitelemeden tamamen gizlenememesini sağlar. Kural olmadan, genel ad alanı içindeki bir ad belirli bir kaynak dosyada gizlenirse, söz konusu ad alanından herhangi bir adın nitelenmiş bir şekilde belirtilmesi mümkün olmazdı.

Bu örnekte deyimi her Imports zaman kaynak dosyadaki System sınıfa değil genel ad alanına başvurur.

Imports System   ' Imports the namespace, not the class.

Class System
End Class

Diğer Adları İçeri Aktar

İçeri aktarma diğer adı, ad alanı veya tür için bir diğer ad tanımlar.

AliasImportsClause
    : Identifier Equals TypeName
    ;
Imports A = N1.N2.A

Namespace N1.N2
    Class A
    End Class
End Namespace

Namespace N3
    Class B
        Inherits A
    End Class
End Namespace

Burada, kaynak dosyanın içinde, A için N1.N2.Abir diğer addır ve bu nedenle sınıfı N3.B sınıfından N1.N2.Atüretilir. Aynı etki, için R bir diğer ad N1.N2 oluşturup öğesine başvurarak R.Aelde edilebilir:

Imports R = N1.N2

Namespace N3
    Class B
        Inherits R.A
    End Class
End Namespace

İçeri aktarma diğer adının tanımlayıcısı, genel ad alanının bildirim alanında bir ad bildirmese bile genel ad alanının bildirim alanında benzersiz olmalıdır (yalnızca içeri aktarma diğer adının tanımlandığı kaynak dosyadaki genel ad alanı bildirimi değil).

Not. Modüldeki bildirimler, içeren bildirim alanına adlar eklemez. Bu nedenle, bildirim adı içeren bildirim alanında erişilebilir olsa bile, bir modüldeki bildirimin içeri aktarma diğer adıyla aynı ada sahip olması geçerlidir.

' Error: Alias A conflicts with typename A
Imports A = N3.A

Class A
End Class

Namespace N3
    Class A
    End Class
End Namespace

Burada, genel ad alanı zaten bir üye Aiçerir, bu nedenle içeri aktarma diğer adının bu tanımlayıcıyı kullanması bir hatadır. Aynı şekilde, aynı kaynak dosyadaki iki veya daha fazla içeri aktarma diğer adının diğer adları aynı ada göre bildirmesi de hatadır.

İçeri aktarma diğer adı, herhangi bir ad alanı veya tür için bir diğer ad oluşturabilir. Ad alanına veya türe bir diğer ad aracılığıyla erişmek, ad alanına veya türüne bildirilen adıyla erişmekle tam olarak aynı sonucu verir.

Imports R1 = N1
Imports R2 = N1.N2

Namespace N1.N2
    Class A
    End Class
End Namespace

Namespace N3
    Class B
        Private a As N1.N2.A
        Private b As R1.N2.A
        Private c As R2.A
    End Class
End Namespace

Burada, , R1.N2.Ave R2.A adları N1.N2.Aeşdeğerdir ve tümü tam adı olan sınıfına başvururN1.N2.A.

İçeri aktarma işlemi, ad alanının veya diğer adın oluşturulduğu türün tam adını belirtir. Bu ad alanının veya türün tam adı olmalıdır: nitelenmiş ad çözümlemesi için normal kuralları kullanmaz (örneğin, türetilmiş bir sınıf aracılığıyla temel sınıfın üyelerine erişim izni verir).

İçeri aktarma diğer adı, bu kurallarla çözümlenemeyen bir türe veya ad alanına işaret ederse, içeri aktarma deyimi yoksayılır (ve derleyici bir uyarı verir).

Ayrıca, başvuru açık bir genel türe olamaz; tüm genel türlerin geçerli tür bağımsız değişkenleri sağlanmalıdır ve tüm tür bağımsız değişkenleri yukarıdaki kurallar tarafından çözümlenebilir olmalıdır. Genel bir türün yanlış bağlaması bir hatadır.

Imports A = G              ' error: since G is an open generic type
Imports B = G(Of Integer)  ' okay
Imports C = Derived.Nested ' warning: Derived.Nested isn't itself a type
Imports D = G(Of Derived.Nested) ' error: Derived.Nested isn't found

Class G(Of T) : End Class

Class Base
    Class Nested : End Class
End Class

Class Derived : Inherits Base
End Class

Module Module1
    Sub Main()
        Dim x As C               ' error: "C" wasn't succesfully defined
        Dim y As Derived.Nested  ' okay
    End Sub
End Module

Kaynak dosyadaki bildirimler, içeri aktarma diğer adı gölgeli olabilir.

Imports R = N1.N2

Namespace N1.N2
    Class A
    End Class
End Namespace

Namespace N3
    Class R
    End Class

    Class B
        Inherits R.A  ' Error, R has no member A
    End Class
End Namespace

Yukarıdaki örnekte, bildiriminde başvurusu hataya R.A neden olur çünkü R öğesine değilN1.N2, öğesine başvururN3.R.B

İçeri aktarma diğer adı, bir diğer adı belirli bir kaynak dosya içinde kullanılabilir hale getirir, ancak temel alınan bildirim alanına yeni üye eklemez. Başka bir deyişle, içeri aktarma diğer adı geçişli değildir, bunun yerine yalnızca oluştuğu kaynak dosyayı etkiler.

File1.vb:

Imports R = N1.N2

Namespace N1.N2
    Class A
    End Class
End Namespace

File2.vb:

Class B
    Inherits R.A ' Error, R unknown.
End Class

Yukarıdaki örnekte, içeri aktarma diğer adının R kapsamı yalnızca içinde bulunduğu kaynak dosyadaki bildirimlere genişletildiğinden, R ikinci kaynak dosyada bilinmiyor.

Ad Alanı İçeri Aktarmaları

Ad alanı içeri aktarma, ad alanı veya türün tüm üyelerini içeri aktararak ad alanının veya türün her üyesinin tanımlayıcısının niteleme olmadan kullanılmasına olanak sağlar. Türlerde, ad alanı içeri aktarma, sınıf adının nitelemesini gerektirmeden yalnızca türün paylaşılan üyelerine erişime izin verir. Özellikle, numaralandırılmış türlerin üyelerinin nitelik olmadan kullanılmasına izin verir.

MembersImportsClause
    : TypeName
    ;

Örneğin:

Imports Colors

Enum Colors
    Red
    Green
    Blue
End Enum

Module M1
    Sub Main()
        Dim c As Colors = Red
    End Sub
End Module

İçeri aktarma diğer adından farklı olarak, ad alanı içeri aktarma işleminin içeri aktardığı adlarda hiçbir kısıtlama yoktur ve tanımlayıcıları genel ad alanı içinde zaten bildirilen ad alanlarını ve türleri içeri aktarabilir. Normal içeri aktarma tarafından içeri aktarılan adlar, kaynak dosyadaki içeri aktarma diğer adları ve bildirimleri tarafından gölgelenir.

Aşağıdaki örnekte, A ad alanında üye bildirimleri N3 yerine N1.N2.A öğesine başvururN3.A.

Imports N1.N2

Namespace N1.N2
    Class A
    End Class
End Namespace

Namespace N3
    Class A
    End Class

    Class B
        Inherits A
    End Class
End Namespace

İçeri aktarılan birden fazla ad alanı aynı ada sahip üyeler içerdiğinde (ve bu ad başka bir şekilde içeri aktarma diğer adı veya bildirimi tarafından gölgelenmediğinde), bu ada başvuru belirsizdir ve derleme zamanı hatasına neden olur.

Imports N1
Imports N2

Namespace N1
    Class A
    End Class
End Namespace 

Namespace N2
    Class A
    End Class
End Namespace 

Namespace N3
    Class B
        Inherits A ' Error, A is ambiguous.
    End Class
End Namespace

Yukarıdaki örnekte, hem hem de N1N2 üyesini Aiçerir. her ikisini de içeri aktardığındanN3, içinde N3 başvuruda A bulunmak derleme zamanı hatasına neden olur. Bu durumda, çakışma, aşağıdaki örnekte olduğu gibi , başvurularının Anitelenmesi yoluyla veya belirli Abir öğesini seçen bir içeri aktarma diğer adı getirilerek çözülebilir:

Imports N1
Imports N2
Imports A = N1.A

Namespace N3
    Class B
        Inherits A ' A means N1.A.
    End Class
End Namespace

Yalnızca ad alanları, sınıflar, yapılar, numaralandırılmış türler ve standart modüller içeri aktarılabilir.

XML Ad Alanı İçeri Aktarmaları

XML ad alanı içeri aktarma işlemi, derleme birimi içinde yer alan nitelenmemiş XML ifadeleri için bir ad alanı veya varsayılan ad alanı tanımlar.

XMLNamespaceImportsClause
    : '<' XMLNamespaceAttributeName XMLWhitespace? Equals XMLWhitespace?
      XMLNamespaceValue '>'
    ;

XMLNamespaceValue
    : DoubleQuoteCharacter XMLAttributeDoubleQuoteValueCharacter* DoubleQuoteCharacter
    | SingleQuoteCharacter XMLAttributeSingleQuoteValueCharacter* SingleQuoteCharacter
    ;

Örneğin:

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

Module Test
    Sub Main()
        ' db namespace is "http://example.org/database"
        Dim x = <db:customer><db:Name>Bob</></>

        Console.WriteLine(x.<db:Name>)
    End Sub
End Module

Varsayılan ad alanı da dahil olmak üzere bir XML ad alanı, belirli bir içeri aktarma kümesi için yalnızca bir kez tanımlanabilir. Örneğin:

Imports <xmlns:db="http://example.org/database-one">
' Error: namespace db is already defined
Imports <xmlns:db="http://example.org/database-two">

Namespace'ler

Visual Basic programları ad alanları kullanılarak düzenlenir. Ad alanları hem bir programı dahili olarak düzenler hem de program öğelerinin diğer programlara gösterilme şeklini düzenler.

Diğer varlıkların aksine, ad alanları açık uçlu olur ve aynı program içinde ve birçok programda birden çok kez bildirilebilir ve her bildirim aynı ad alanına üye katkıda bulunur. Aşağıdaki örnekte, iki ad alanı bildirimi aynı bildirim alanına katkıda bulunur ve tam adlarıyla N1.N2.A ve N1.N2.Bile iki sınıf bildirir.

Namespace N1.N2
    Class A
    End Class
End Namespace

Namespace N1.N2
    Class B
    End Class
End Namespace

İki bildirim aynı bildirim alanına katkıda bulunduğundan, her biri aynı ada sahip bir üye bildirimi içeriyorsa hata olur.

Adı olmayan ve iç içe ad alanlarına ve türlerine her zaman nitelik olmadan erişilebilen genel bir ad alanı vardır. Genel ad alanında bildirilen bir ad alanı üyesinin kapsamı, program metninin tamamıdır. Aksi takdirde, tam adı N ad alanında bildirilen bir türün veya ad alanının kapsamı, karşılık gelen ad alanının tam adı ile N başlayan veya kendisi olan her ad alanının program metnidir N . (Bir derleyicinin bildirimleri varsayılan olarak belirli bir ad alanına yerleştirmeyi seçebileceğini unutmayın. Bu, hala genel, adsız bir ad alanı olduğu gerçeğini değiştirmez.)

Bu örnekte, 'Bnin ad alanı kavramsal olarak ad alanı N1.N2.N3 içinde iç içe olduğundan Bsınıfını AN1.N2görebilir.

Namespace N1.N2
    Class A
    End Class
End Namespace

Namespace N1.N2.N3
    Class B
        Inherits A
    End Class
End Namespace

Ad Alanı Bildirimleri

Ad alanı bildiriminin üç biçimi vardır.

NamespaceDeclaration
    : 'Namespace' NamespaceName StatementTerminator
      NamespaceMemberDeclaration*
      'End' 'Namespace' StatementTerminator
    ;

NamespaceName
    : RelativeNamespaceName
    | 'Global'
    | 'Global' '.' RelativeNamespaceName
    ;

RelativeNamespaceName
    : Identifier ( Period IdentifierOrKeyword )*
    ;

İlk form, anahtar sözcüğünden Namespace sonra göreli ad alanı adıyla başlar. Göreli ad alanı adı nitelenmişse, ad alanı bildirimi, nitelenmiş ad alanında her ada karşılık gelen ad alanı bildirimleri içinde sözcük temelli olarak iç içe yerleştirilmiş gibi kabul edilir. Örneğin, aşağıdaki iki ad alanı ad alanına eşdeğerdir:

Namespace N1.N2
    Class A
    End Class

    Class B
    End Class
End Namespace 

Namespace N1
    Namespace N2
        Class A
        End Class

        Class B
        End Class
    End Namespace
End Namespace

İkinci form anahtar sözcüklerle Namespace Globalbaşlar. Derleme ortamı tarafından sağlanan varsayılan değerler ne olursa olsun, tüm üye bildirimleri genel adsız ad alanına sözcük temelli olarak yerleştirilmiş gibi değerlendirilir. Bu ad alanı bildirimi biçimi, başka bir ad alanı bildirimi içinde sözcük temelli olarak iç içe yerleştirilmeyebilir.

Üçüncü form anahtar sözcüklerle Namespace Global başlar ve ardından bir nitelenmiş tanımlayıcı Nile başlar. Derleme ortamı tarafından sağlanan varsayılan değerlerden bağımsız olarak genel ad alanına sözcük temelli olarak yerleştirilmiş ilk "" formunNamespace N ad alanı bildirimiymiş gibi değerlendirilir. Bu ad alanı bildirimi biçimi, başka bir ad alanı bildirimi içinde sözcük temelli olarak iç içe yerleştirilmeyebilir.

Namespace Global       ' Puts N1.A in the global namespace
    Namespace N1
        Class A
        End Class
    End Namespace
End Namespace

Namespace Global.N1    ' Equivalent to the above
    Class A
    End Class
End Namespace

Namespace N1           ' May or may not be equivalent to the above,
    Class A            ' depending on defaults provided by the
    End Class          ' compilation environment
End Namespace

Ad alanının üyeleriyle ilgilenirken, belirli bir üyenin nerede bildirildiği önemli değildir. İki program aynı ad alanında aynı ada sahip bir varlık tanımlarsa, ad alanındaki adı çözümlemeye çalışmak belirsizlik hatasına neden olur.

Ad alanları tanımına Publicgöredir, bu nedenle ad alanı bildirimi herhangi bir erişim değiştirici içeremez.

Ad Alanı Üyeleri

Ad alanı üyeleri yalnızca ad alanı bildirimleri ve tür bildirimleri olabilir. Tür bildirimlerinin veya PublicFriend erişimi olabilir. Türler için varsayılan erişim erişimdir Friend .

NamespaceMemberDeclaration
    : NamespaceDeclaration
    | TypeDeclaration
    ;

TypeDeclaration
    : ModuleDeclaration
    | NonModuleDeclaration
    ;

NonModuleDeclaration
    : EnumDeclaration
    | StructureDeclaration
    | InterfaceDeclaration
    | ClassDeclaration
    | DelegateDeclaration
    ;