Visual Basic 프로그램은 하나 이상의 원본 파일로 구성됩니다. 프로그램이 컴파일되면 모든 원본 파일이 함께 처리됩니다. 따라서 원본 파일은 정방향 선언 요구 사항 없이 순환 방식으로 서로 종속할 수 있습니다. 프로그램 텍스트에서 선언의 텍스트 순서는 일반적으로 의미가 없습니다.
원본 파일은 옵션 문, 가져오기 문 및 특성의 선택적 집합으로 구성되며, 그 뒤에 네임스페이스 본문이 잇습니다. 각각 AssemblyModule 또는 한정자가 있어야 하는 특성은 컴파일에서 생성된 .NET 어셈블리 또는 모듈에 적용됩니다. 원본 파일의 본문은 전역 네임스페이스에 대한 암시적 네임스페이스 선언으로 작동합니다. 즉, 원본 파일의 최상위 수준에 있는 모든 선언이 전역 네임스페이스에 배치됩니다. 다음은 그 예입니다.
FileA.vb:
Class A
End Class
FileB.vb:
Class B
End Class
두 소스 파일은 전역 네임스페이스에 기여합니다. 이 경우 정규화된 이름과 AB2개의 클래스를 선언합니다. 두 소스 파일이 동일한 선언 공간에 기여하기 때문에 각각 같은 이름의 멤버 선언이 포함된 경우 오류가 발생했을 것입니다.
메모. 컴파일 환경에서는 소스 파일이 암시적으로 배치되는 네임스페이스 선언을 재정의할 수 있습니다.
명시된 경우를 제외하고 Visual Basic 프로그램 내의 문은 줄 종결자 또는 콜론으로 종료될 수 있습니다.
Start
: OptionStatement* ImportsStatement* AttributesStatement* NamespaceMemberDeclaration*
;
StatementTerminator
: LineTerminator
| ':'
;
AttributesStatement
: Attributes StatementTerminator
;
프로그램 시작 및 종료
프로그램 시작은 실행 환경에서 프로그램의 진입점이라고 하는 지정된 메서드를 실행할 때 발생합니다. 항상 이름을 지정 Main해야 하는 이 진입점 메서드는 공유되어야 하고, 제네릭 형식에 포함될 수 없으며, 비동기 한정자를 가질 수 없으며, 다음 서명 중 하나가 있어야 합니다.
Sub Main()
Sub Main(args() As String)
Function Main() As Integer
Function Main(args() As String) As Integer
진입점 메서드의 접근성은 관련이 없습니다. 프로그램에 둘 이상의 적합한 진입점이 포함된 경우 컴파일 환경에서 진입점으로 지정해야 합니다. 그렇지 않으면 컴파일 시간 오류가 발생합니다. 컴파일 환경이 없는 경우 진입점 메서드를 만들 수도 있습니다.
프로그램이 시작될 때 진입점에 매개 변수가 있는 경우 실행 환경에서 제공하는 인수에는 문자열로 표시되는 프로그램에 대한 명령줄 인수가 포함됩니다. 진입점에 반환 형식 Integer이 있는 경우 함수에서 반환된 값은 프로그램의 결과로 실행 환경으로 반환됩니다.
다른 모든 면에서 진입점 메서드는 다른 메서드와 동일한 방식으로 동작합니다. 실행 환경에서 만든 진입점 메서드의 호출을 실행에서 벗어나면 프로그램이 종료됩니다.
컴파일 옵션
소스 파일은 옵션 문을 사용하여 소스 코드에서 컴파일 옵션을 지정할 수 있습니다.
OptionStatement
: OptionExplicitStatement
| OptionStrictStatement
| OptionCompareStatement
| OptionInferStatement
;
문은 Option 표시되는 원본 파일에만 적용되며 각 문 Option 유형 중 하나만 원본 파일에 나타날 수 있습니다. 다음은 그 예입니다.
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.
strict 형식 의미 체계, 명시적 선언 의미 체계, 비교 의미 체계 및 지역 변수 형식 유추 의미 체계의 네 가지 컴파일 옵션이 있습니다. 원본 파일에 특정 Option 문이 포함되지 않은 경우 컴파일 환경에서 사용할 특정 의미 체계 집합을 결정합니다. 또한 컴파일 환경을 통해서만 지정할 수 있는 다섯 번째 컴파일 옵션인 정수 오버플로 검사도 있습니다.
Option Explicit 문
이 문은 Option Explicit 지역 변수를 암시적으로 선언할 수 있는지 여부를 결정합니다. 키워드 On 이거나 Off 문을 따를 수 있습니다. 둘 다 지정되지 않은 경우 기본값은 .입니다 On. 파일에 문이 지정되지 않은 경우 컴파일 환경에서 사용할 문을 결정합니다.
OptionExplicitStatement
: 'Option' 'Explicit' OnOff? StatementTerminator
;
OnOff
: 'On' | 'Off'
;
메모.
Explicit 예약 Off 된 단어가 아닙니다.
Option Explicit Off
Module Test
Sub Main()
x = 5 ' Valid because Option Explicit is off.
End Sub
End Module
이 예제에서는 지역 변수 x 를 할당하여 암시적으로 선언합니다.
x의 형식은 Object입니다.
Option Strict 문
이 문은 Option Strict 변환 및 연산이 Object 엄격하거나 허용적인 형식 의미 체계에 의해 제어되는지 여부와 지정된 절이 없는 As 것처럼 Object 형식이 암시적으로 형식화되는지 여부를 결정합니다. 문 뒤에 키워드가 올 수도 있습니다. OnOff둘 다 지정하지 않으면 기본값은 .입니다 On. 파일에 문이 지정되지 않은 경우 컴파일 환경에서 사용할 문을 결정합니다.
OptionStrictStatement
: 'Option' 'Strict' OnOff? StatementTerminator
;
메모.
Strict 예약 Off 된 단어가 아닙니다.
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
엄격한 의미 체계에서는 다음이 허용되지 않습니다.
명시적 캐스트 연산자 없이 변환 축소
지연 바인딩.
...,
Is및IsNot.Is이외의TypeOf형식Object에 대한 작업유추된 형식이 없는 선언에서 절을 생략
As합니다.
Option Compare 문
문은 Option Compare 문자열 비교의 의미 체계를 결정합니다. 문자열 비교는 이진 비교(각 문자의 이진 유니코드 값이 비교됨) 또는 텍스트 비교(현재 문화권을 사용하여 각 문자의 어휘 의미를 비교하는 경우)를 사용하여 수행됩니다. 파일에 문이 지정되지 않은 경우 컴파일 환경은 사용할 비교 유형을 제어합니다.
OptionCompareStatement
: 'Option' 'Compare' CompareOption StatementTerminator
;
CompareOption
: 'Binary' | 'Text'
;
참고.CompareBinary 예약 Text 단어는 아닙니다.
Option Compare Text
Module Test
Sub Main()
Console.WriteLine("a" = "A") ' Prints True.
End Sub
End Module
이 경우 문자열 비교는 대/소문자를 무시하는 텍스트 비교를 사용하여 수행됩니다. 지정한 경우 Option Compare Binary 인쇄되었을 False것입니다.
정수 오버플로 검사
정수 작업은 런타임에 오버플로 조건을 확인하거나 확인할 수 없습니다. 오버플로 조건이 검사되고 정수 작업이 오버플로되면 예외가 System.OverflowException throw됩니다. 오버플로 조건을 확인하지 않으면 정수 작업 오버플로가 예외를 throw하지 않습니다. 컴파일 환경에서는 이 옵션이 켜지거나 꺼져 있는지 여부를 결정합니다.
Option Infer 문
이 문은 Option Infer 절이 없는 As 지역 변수 선언에 유추된 형식이 있는지 또는 사용하는 Object지를 결정합니다. 문 뒤에 키워드가 올 수도 있습니다. OnOff둘 다 지정하지 않으면 기본값은 .입니다 On. 파일에 문이 지정되지 않은 경우 컴파일 환경에서 사용할 문을 결정합니다.
OptionInferStatement
: 'Option' 'Infer' OnOff? StatementTerminator
;
메모.
Infer 예약 Off 된 단어가 아닙니다.
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 문
Imports 문은 엔터티의 이름을 원본 파일로 가져와서 정규화 없이 이름을 참조하거나 XML 식에 사용할 네임스페이스를 가져올 수 있습니다.
ImportsStatement
: 'Imports' ImportsClauses StatementTerminator
;
ImportsClauses
: ImportsClause ( Comma ImportsClause )*
;
ImportsClause
: AliasImportsClause
| MembersImportsClause
| XMLNamespaceImportsClause
;
다음 예제와 같이 문이 포함된 Imports 소스 파일의 멤버 선언 내에서 지정된 네임스페이스에 포함된 형식을 직접 참조할 수 있습니다.
Imports N1.N2
Namespace N1.N2
Class A
End Class
End Namespace
Namespace N3
Class B
Inherits A
End Class
End Namespace
여기서는 소스 파일 내에서 네임스페이스의 N1.N2 형식 멤버를 직접 사용할 수 있으므로 클래스 N3.B 는 클래스 N1.N2.A에서 파생됩니다.
Imports 문은 문 Option 뒤와 형식 선언 앞에 나타나야 합니다. 컴파일 환경에서는 암시적 Imports 문을 정의할 수도 있습니다.
Imports 문을 사용하면 원본 파일에서 이름을 사용할 수 있지만 전역 네임스페이스의 선언 공간에서는 아무 것도 선언하지 않습니다. 문에서 가져온 Imports 이름의 범위는 소스 파일에 포함된 네임스페이스 멤버 선언을 통해 확장됩니다. 문의 범위 Imports 는 특히 다른 문을 포함하지 않으며 다른 Imports 소스 파일도 포함하지 않습니다.
Imports 문은 서로를 참조할 수 없습니다.
이 예제에서 마지막 Imports 문은 첫 번째 가져오기 별칭의 영향을 받지 않으므로 오류가 발생합니다.
Imports R1 = N1 ' OK.
Imports R2 = N1.N2 ' OK.
Imports R3 = R1.N2 ' Error: Can't refer to R1.
Namespace N1.N2
End Namespace
메모. 문에 Imports 표시되는 네임스페이스 또는 형식 이름은 항상 정규화된 것처럼 처리됩니다. 즉, 네임스페이스 또는 형식 이름의 맨 왼쪽 식별자는 항상 전역 네임스페이스에서 확인되고 나머지 확인은 일반 이름 확인 규칙에 따라 진행됩니다. 이러한 규칙을 적용하는 언어의 유일한 위치입니다. 규칙은 이름을 정규화에서 완전히 숨길 수 없도록 합니다. 규칙이 없으면 전역 네임스페이스의 이름이 특정 소스 파일에 숨겨져 있으면 정규화된 방식으로 해당 네임스페이스의 이름을 지정할 수 없습니다.
이 예제에서 문은 Imports 항상 원본 파일의 클래스가 아니라 전역 System 네임스페이스를 참조합니다.
Imports System ' Imports the namespace, not the class.
Class System
End Class
별칭 가져오기
가져오기 별칭은 네임스페이스 또는 형식에 대한 별칭을 정의합니다.
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
여기서는 소스 파일 A 내에서 별칭 N1.N2.A이 있으므로 클래스는 클래스 N3.BN1.N2.A에서 파생됩니다. 별칭 RN1.N2 을 만든 다음 다음을 참조하여 동일한 효과를 얻을 수 있습니다.R.A
Imports R = N1.N2
Namespace N3
Class B
Inherits R.A
End Class
End Namespace
가져오기 별칭의 식별자는 전역 네임스페이스의 선언 공간에서 이름을 선언하지 않더라도 전역 네임스페이스의 선언 공간 내에서 고유해야 합니다(가져오기 별칭이 정의된 원본 파일의 전역 네임스페이스 선언뿐만 아니라).
메모. 모듈의 선언은 포함하는 선언 공간에 이름을 도입하지 않습니다. 따라서 포함하는 선언 공간에서 선언의 이름에 액세스할 수 있더라도 모듈의 선언이 가져오기 별칭과 동일한 이름을 갖는 것이 유효합니다.
' Error: Alias A conflicts with typename A
Imports A = N3.A
Class A
End Class
Namespace N3
Class A
End Class
End Namespace
여기서 전역 네임스페이스에는 이미 멤버 A가 포함되어 있으므로 가져오기 별칭에서 해당 식별자를 사용하는 것은 오류입니다. 같은 소스 파일에서 두 개 이상의 가져오기 별칭이 같은 이름으로 별칭을 선언하는 경우와 마찬가지로 오류가 발생합니다.
가져오기 별칭은 모든 네임스페이스 또는 형식에 대한 별칭을 만들 수 있습니다. 별칭을 통해 네임스페이스 또는 형식에 액세스하면 선언된 이름을 통해 네임스페이스 또는 형식에 액세스하는 것과 정확히 동일한 결과가 생성됩니다.
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
여기서는 이름 N1.N2.A, R1.N2.A및 R2.A 해당 항목이 모두 정규화된 이름이 있는 클래스를 참조합니다 N1.N2.A.
가져오기는 별칭을 만드는 네임스페이스 또는 형식의 정확한 이름을 지정합니다. 이 이름은 해당 네임스페이스 또는 형식의 정확한 정규화된 이름이어야 합니다. 정규화된 이름 확인에는 일반 규칙을 사용하지 않습니다(예: 파생 클래스를 통해 기본 클래스의 멤버에 대한 액세스를 허용).
가져오기 별칭이 이러한 규칙으로 확인할 수 없는 형식 또는 네임스페이스를 가리키는 경우 import 문은 무시되고 컴파일러는 경고를 제공합니다.
또한 참조는 열려 있는 제네릭 형식일 수 없습니다. 모든 제네릭 형식에는 유효한 형식 인수가 제공되어야 하며, 모든 형식 인수는 위의 규칙에 따라 확인할 수 있어야 합니다. 제네릭 형식의 잘못된 바인딩은 오류입니다.
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
소스 파일의 선언은 가져오기 별칭 이름을 숨깁니다.
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
앞의 예제에서 선언 B 에서 참조 R.A 하면 오류가 R 발생합니다.N3.RN1.N2
가져오기 별칭은 특정 소스 파일 내에서 별칭을 사용할 수 있도록 하지만 기본 선언 공간에 새 멤버를 제공하지는 않습니다. 즉, 가져오기 별칭은 전이적이 아니라 발생하는 원본 파일에만 영향을 줍니다.
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
위의 예제에서 도입 R 되는 가져오기 별칭의 범위는 포함된 R 소스 파일의 선언으로만 확장되므로 두 번째 소스 파일에서는 알 수 없습니다.
네임스페이스 가져오기
네임스페이스 가져오기는 네임스페이스 또는 형식의 모든 멤버를 가져와 네임스페이스 또는 형식의 각 멤버의 식별자를 한정 없이 사용할 수 있도록 합니다. 형식의 경우 네임스페이스 가져오기는 클래스 이름의 정규화 없이 형식의 공유 멤버에 대한 액세스만 허용합니다. 특히 열거형 형식의 멤버를 한정 없이 사용할 수 있습니다.
MembersImportsClause
: TypeName
;
다음은 그 예입니다.
Imports Colors
Enum Colors
Red
Green
Blue
End Enum
Module M1
Sub Main()
Dim c As Colors = Red
End Sub
End Module
가져오기 별칭과 달리 네임스페이스 가져오기는 가져오는 이름에 제한이 없으며, 식별자가 전역 네임스페이스 내에서 이미 선언된 네임스페이스 및 형식을 가져올 수 있습니다. 일반 가져오기에서 가져온 이름은 소스 파일의 가져오기 별칭 및 선언에 의해 숨깁니다.
다음 예제 A 에서는 네임스페이스의 N3.A 멤버 선언 내에 있는 것이 아니라 N1.N2.A 참조합니다 N3 .
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
가져온 네임스페이스가 둘 이상 같은 이름의 멤버를 포함하고 해당 이름이 가져오기 별칭 또는 선언에 의해 그림자로 표시되지 않는 경우 해당 이름에 대한 참조가 모호하며 컴파일 시간 오류가 발생합니다.
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
위의 예제에서는 둘 다 N1 멤버 N2A를 포함합니다. 둘 다 가져오기 때문에 N3 참조하면 AN3 컴파일 시간 오류가 발생합니다. 이 경우 다음 예제와 같이 참조 A를 한정하거나 특정 A항목을 선택하는 가져오기 별칭을 도입하여 충돌을 해결할 수 있습니다.
Imports N1
Imports N2
Imports A = N1.A
Namespace N3
Class B
Inherits A ' A means N1.A.
End Class
End Namespace
네임스페이스, 클래스, 구조체, 열거형 형식 및 표준 모듈만 가져올 수 있습니다.
XML 네임스페이스 가져오기
XML 네임스페이스 가져오기는 컴파일 단위에 포함된 정규화되지 않은 XML 식에 대한 네임스페이스 또는 기본 네임스페이스를 정의합니다.
XMLNamespaceImportsClause
: '<' XMLNamespaceAttributeName XMLWhitespace? Equals XMLWhitespace?
XMLNamespaceValue '>'
;
XMLNamespaceValue
: DoubleQuoteCharacter XMLAttributeDoubleQuoteValueCharacter* DoubleQuoteCharacter
| SingleQuoteCharacter XMLAttributeSingleQuoteValueCharacter* SingleQuoteCharacter
;
다음은 그 예입니다.
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
기본 네임스페이스를 포함한 XML 네임스페이스는 특정 가져오기 집합에 대해 한 번만 정의할 수 있습니다. 다음은 그 예입니다.
Imports <xmlns:db="http://example.org/database-one">
' Error: namespace db is already defined
Imports <xmlns:db="http://example.org/database-two">
네임스페이스
Visual Basic 프로그램은 네임스페이스를 사용하여 구성됩니다. 네임스페이스는 내부적으로 프로그램을 구성하고 프로그램 요소가 다른 프로그램에 노출되는 방식을 구성합니다.
다른 엔터티와 달리 네임스페이스는 개방형이며 동일한 프로그램 및 여러 프로그램에서 여러 번 선언될 수 있으며 각 선언은 멤버를 동일한 네임스페이스에 기여합니다. 다음 예제에서는 두 네임스페이스 선언이 동일한 선언 공간에 기여하여 정규화된 이름과 N1.N2.AN1.N2.B두 클래스를 선언합니다.
Namespace N1.N2
Class A
End Class
End Namespace
Namespace N1.N2
Class B
End Class
End Namespace
두 선언이 동일한 선언 공간에 기여하기 때문에 각 선언에 이름이 같은 멤버의 선언이 포함된 경우 오류가 발생합니다.
이름이 없고 중첩된 네임스페이스와 형식을 정규화하지 않고 항상 액세스할 수 있는 전역 네임스페이스가 있습니다. 전역 네임스페이스에 선언된 네임스페이스 멤버의 범위는 전체 프로그램 텍스트입니다. 그렇지 않으면 정규화된 이름이 해당 네임스페이스의 정규화된 이름이 N 시작 N 되거나 그 자체인 각 네임스페이스의 프로그램 텍스트인 네임스페이스에 선언된 형식 또는 네임스페이스의 범위입니다 N . 컴파일러는 기본적으로 특정 네임스페이스에 선언을 배치하도록 선택할 수 있습니다. 이렇게 해도 이름 없는 전역 네임스페이스가 여전히 있다는 사실은 변경되지 않습니다.)
이 예제에서는 '의 네임스페이스가 개념적으로 네임스페이스 N1.N2.N3 내에 중첩되어 있으므로 B클래스 B 가 클래스 A 를 N1.N2볼 수 있습니다.
Namespace N1.N2
Class A
End Class
End Namespace
Namespace N1.N2.N3
Class B
Inherits A
End Class
End Namespace
네임스페이스 선언
네임스페이스 선언에는 세 가지 형식이 있습니다.
NamespaceDeclaration
: 'Namespace' NamespaceName StatementTerminator
NamespaceMemberDeclaration*
'End' 'Namespace' StatementTerminator
;
NamespaceName
: RelativeNamespaceName
| 'Global'
| 'Global' '.' RelativeNamespaceName
;
RelativeNamespaceName
: Identifier ( Period IdentifierOrKeyword )*
;
첫 번째 양식은 키워드 Namespace 와 상대 네임스페이스 이름으로 시작합니다. 상대 네임스페이스 이름이 정규화된 경우 네임스페이스 선언은 정규화된 이름의 각 이름에 해당하는 네임스페이스 선언 내에 어휘적으로 중첩된 것처럼 처리됩니다. 예를 들어 다음 두 네임스페이스는 의미상 동일합니다.
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
두 번째 양식은 키워드로 시작합니다 Namespace Global. 컴파일 환경에서 제공하는 기본값에 관계없이 모든 멤버 선언이 전역 명명되지 않은 네임스페이스에 어휘적으로 배치된 것처럼 처리됩니다. 이 형식의 네임스페이스 선언은 다른 네임스페이스 선언 내에서 어휘적으로 중첩되지 않을 수 있습니다.
세 번째 양식은 키워드 Namespace Global 와 정규화된 식별자로 시작합니다 N. 컴파일 환경에서 제공하는 기본값에 관계없이 전역 명명되지 않은 네임스페이스에 어휘적으로 배치된 첫 번째 형식 "Namespace N"의 네임스페이스 선언인 것처럼 처리됩니다. 이 형식의 네임스페이스 선언은 다른 네임스페이스 선언 내에서 어휘적으로 중첩되지 않을 수 있습니다.
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
네임스페이스의 멤버를 처리할 때 특정 멤버가 선언되는 위치는 중요하지 않습니다. 두 프로그램이 동일한 네임스페이스에서 이름이 같은 엔터티를 정의하는 경우 네임스페이스에서 이름을 확인하려고 하면 모호성 오류가 발생합니다.
네임스페이스는 정의 Public에 따라 지정되므로 네임스페이스 선언에는 액세스 한정자를 포함할 수 없습니다.
네임스페이스 멤버
네임스페이스 멤버는 네임스페이스 선언 및 형식 선언만 될 수 있습니다. 형식 선언에는 액세스 권한이 있거나 Friend 액세스할 수 있습니다Public. 형식에 대한 기본 액세스 권한은 액세스입니다 Friend .
NamespaceMemberDeclaration
: NamespaceDeclaration
| TypeDeclaration
;
TypeDeclaration
: ModuleDeclaration
| NonModuleDeclaration
;
NonModuleDeclaration
: EnumDeclaration
| StructureDeclaration
| InterfaceDeclaration
| ClassDeclaration
| DelegateDeclaration
;
Visual Basic language spec