모듈에서 프로그래밍 요소를 선언하면 Visual Basic은 해당 범위를 모듈이 포함된 네임스페이스로 승격합니다. 이를 형식 승격이라고합니다.
다음 예제에서는 모듈의 기본 정의와 해당 모듈의 두 멤버를 보여줍니다.
Namespace projNamespace
Module projModule
Public Enum basicEnum As Integer
one = 1
two = 2
End Enum
Public Class innerClass
Shared Sub numberSub(ByVal firstArg As Integer)
End Sub
End Class
End Module
End Namespace
내에서 projModule모듈 수준에서 선언된 프로그래밍 요소는 .로 projNamespace승격됩니다. 앞의 예제 basicEnuminnerClass 에서는 모듈 수준에서 선언되지 않으므로 승격되지만 numberSub 승격되지는 않습니다.
형식 승격 효과
형식 승격의 효과는 한정 문자열에 모듈 이름을 포함할 필요가 없다는 것입니다. 다음 예제에서는 앞의 예제에서 프로시저를 두 차례 호출합니다.
Sub usePromotion()
projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub
앞의 예제에서 첫 번째 호출은 완전한 자격 문자열을 사용합니다. 타입 프로모션 때문에 이것은 필요하지 않습니다. 또한 두 번째 호출은 정규화 문자열을 포함하지 projModule 않고 모듈의 멤버에 액세스합니다.
형식 승격의 패배
네임스페이스에 모듈 멤버와 이름이 같은 멤버가 이미 있는 경우 해당 모듈 멤버에 대해 형식 승격이 무효화됩니다. 다음 예제에서는 열거형의 기본 정의와 동일한 네임스페이스 내의 모듈을 보여줍니다.
Namespace thisNamespace
Public Enum abc
first = 1
second
End Enum
Module thisModule
Public Class abc
Public Sub abcSub()
End Sub
End Class
Public Class xyz
Public Sub xyzSub()
End Sub
End Class
End Module
End Namespace
앞의 예제에서 Visual Basic은 네임스페이스 수준에서 이름이 같은 열거형이 이미 있으므로 클래스 abcthisNameSpace 를 승격할 수 없습니다.
abcSub에 액세스하려면 완전 자격 문자열 thisNamespace.thisModule.abc.abcSub을 사용해야 합니다. 그러나 클래스 xyz는 계속 승격되며, xyzSub라는 더 짧은 한정 문자열로 thisNamespace.xyz.xyzSub에 액세스할 수 있습니다.
부분 형식에 대한 형식 승격의 패배
모듈 내의 클래스 또는 구조체가 Partial 키워드를 사용하는 경우 네임스페이스에 이름이 같은 멤버가 있는지 여부에 관계없이 해당 클래스 또는 구조체에 대해 형식 승격이 자동으로 무효화됩니다. 모듈의 다른 요소는 여전히 형식 승격에 적합합니다.
결과(들) 부분 정의의 형식 승격을 무효화하면 예기치 않은 결과와 컴파일러 오류가 발생할 수 있습니다. 다음 예제에서는 클래스의 기본 부분 정의를 보여 줍니다. 그 중 하나는 모듈 내에 있습니다.
Namespace sampleNamespace
Partial Public Class sampleClass
Public Sub sub1()
End Sub
End Class
Module sampleModule
Partial Public Class sampleClass
Public Sub sub2()
End Sub
End Class
End Module
End Namespace
앞의 예제에서 개발자는 컴파일러가 두 부분 정의를 병합할 것으로 예상할 수 있습니다 sampleClass. 그러나 컴파일러는 내부의 sampleModule부분 정의에 대한 승격을 고려하지 않습니다. 둘 다 sampleClass라는 이름을 가졌지만, 서로 다른 한정 경로를 가진 두 개의 별개의 클래스를 컴파일하려고 시도합니다.
컴파일러는 정규화된 경로가 동일한 경우에만 부분 정의를 병합합니다.
권장 사항
다음 권장 사항은 좋은 프로그래밍 방법을 나타냅니다.
고유한 이름입니다. 프로그래밍 요소의 명명을 완전히 제어할 수 있는 경우 모든 곳에서 고유한 이름을 사용하는 것이 좋습니다. 동일한 이름에는 추가 한정이 필요하며 코드를 읽기 어렵게 만들 수 있습니다. 또한 미묘한 오류와 예기치 않은 결과를 초래할 수 있습니다.
완전 자격 동일한 네임스페이스에서 모듈 및 기타 요소를 사용하는 경우 가장 안전한 방법은 항상 모든 프로그래밍 요소에 대해 전체 자격을 사용하는 것입니다. 모듈 멤버에 대해 형식 승격이 실패하고 해당 멤버를 정규화하지 않은 경우 실수로 다른 프로그래밍 요소에 액세스할 수 있습니다.
참고하십시오
.NET