다음을 통해 공유


선언된 요소에 대한 참조(Visual Basic)

코드가 선언된 요소를 참조하는 경우 Visual Basic 컴파일러는 참조의 이름과 해당 이름의 적절한 선언과 일치합니다. 동일한 이름으로 둘 이상의 요소가 선언된 경우 해당 이름을 한정하여 참조할 요소를 제어할 수 있습니다.

컴파일러는 이름 선언에 대한 이름 참조를 가장 좁은 범위와 일치시키려고 시도합니다. 즉, 참조를 만드는 코드로 시작하고 포함 요소의 연속 수준을 통해 바깥쪽으로 작동합니다.

다음 예제에서는 이름이 같은 두 변수에 대한 참조를 보여 줍니다. 이 예제에서는 모듈totalCount의 서로 다른 범위 수준에서 각각 이름이 지정된 container두 개의 변수를 선언합니다. 프로시저 showCount 가 정규화 없이 표시 totalCount 되면 Visual Basic 컴파일러는 가장 좁은 범위, 즉 내부 showCount로컬 선언을 사용하여 선언에 대한 참조를 확인합니다. 이totalCount가 포함하는 모듈container을 수반할 경우, 컴파일러는 더 넓은 범위를 가진 선언에 대한 참조를 해결합니다.

' Assume these two modules are both in the same assembly.  
Module container  
    Public totalCount As Integer = 1  
    Public Sub showCount()  
        Dim totalCount As Integer = 6000  
        ' The following statement displays the local totalCount (6000).  
        MsgBox("Unqualified totalCount is " & CStr(totalCount))  
        ' The following statement displays the module's totalCount (1).  
        MsgBox("container.totalCount is " & CStr(container.totalCount))  
    End Sub  
End Module  
Module callingModule  
    Public Sub displayCount()  
        container.showCount()  
        ' The following statement displays the containing module's totalCount (1).  
        MsgBox("container.totalCount is " & CStr(container.totalCount))  
    End Sub  
End Module  

요소 이름 한정

이 검색 프로세스를 재정의하고 더 넓은 범위에서 선언된 이름을 지정하려면 더 넓은 범위의 포함 요소로 이름을 한정 해야 합니다. 경우에 따라 포함 요소를 한정해야 할 수도 있습니다.

이름을 한정한다는 것은 대상 요소가 정의된 위치를 식별하는 정보를 원본 문에 앞서 추가하는 것을 의미합니다. 이 정보를 정규화 문자열이라고 합니다. 하나 이상의 네임스페이스와 모듈, 클래스 또는 구조를 포함할 수 있습니다.

한정 문자열은 대상 요소를 포함하는 모듈, 클래스 또는 구조를 명확하게 지정해야 합니다. 컨테이너는 다른 포함 요소(일반적으로 네임스페이스)에 있을 수 있습니다. 한정 문자열에 포함된 여러 요소를 포함해야 할 수도 있습니다.

이름을 한정하여 선언된 요소에 액세스하려면

  1. 요소가 정의된 위치를 결정합니다. 여기에는 네임스페이스 또는 네임스페이스의 계층 구조가 포함될 수 있습니다. 최하위 수준 네임스페이스 내에서 요소는 모듈, 클래스 또는 구조체에 포함되어야 합니다.

    ' Assume the following hierarchy exists outside your code.  
    Namespace outerSpace  
        Namespace innerSpace  
            Module holdsTotals  
                Public Structure totals  
                    Public thisTotal As Integer  
                    Public Shared grandTotal As Long  
                End Structure  
            End Module  
        End Namespace  
    End Namespace  
    
  2. 대상 요소의 위치에 따라 정규화 경로를 결정합니다. 가장 높은 수준의 네임스페이스로 시작하고, 가장 낮은 수준의 네임스페이스로 진행하고, 대상 요소를 포함하는 모듈, 클래스 또는 구조체로 끝납니다. 경로의 각 요소에는 해당 요소 뒤에 있는 요소가 포함되어야 합니다.

    outerSpace innerSpace → → holdsTotalstotals

  3. 대상 요소에 대한 자격 문자열을 준비합니다. 경로의 모든 요소 앞에 마침표(.)를 배치합니다. 애플리케이션은 자격 문자열의 모든 요소에 액세스할 수 있어야 합니다.

    outerSpace.innerSpace.holdsTotals.totals.  
    
  4. 일반적인 방식으로 대상 요소를 참조하는 식 또는 할당 문을 작성합니다.

    grandTotal = 9000  
    
  5. 대상 요소 이름 앞에 정규화 문자열을 지정합니다. 이름은 요소를 포함하는 모듈, 클래스 또는 구조체 뒤에 있는 마침표(.)를 바로 따라야 합니다.

    ' Assume the following module is part of your code.  
    Module accessGrandTotal  
        Public Sub setGrandTotal()  
            outerSpace.innerSpace.holdsTotals.totals.grandTotal = 9000  
        End Sub  
    End Module  
    
  6. 컴파일러는 자격 문자열을 사용하여 대상 요소 참조와 일치할 수 있는 명확하고 모호하지 않은 선언을 찾습니다.

애플리케이션에서 이름이 같은 둘 이상의 프로그래밍 요소에 액세스할 수 있는 경우 이름 참조를 한정해야 할 수도 있습니다. 예를 들어 네임스페이스 System.Windows.FormsSystem.Web.UI.WebControls는 모두 클래스 Label(System.Windows.Forms.LabelSystem.Web.UI.WebControls.Label)를 포함합니다. 애플리케이션에서 둘 다 사용하거나 자체 Label 클래스를 정의하는 경우 다른 Label 개체를 구분해야 합니다. 변수 선언에 네임스페이스를 포함하거나 별칭을 가져옵니다. 다음 예제에서는 가져오기 별칭을 사용합니다.

' The following statement must precede all your declarations.  
Imports win = System.Windows.Forms, web = System.Web.UI.WebControls  
' The following statement references the Windows.Forms.Label class.  
Dim winLabel As New win.Label()  

다른 포함 요소의 멤버

다른 클래스 또는 구조체의 공유되지 않은 멤버를 사용하는 경우 먼저 클래스 또는 구조체의 인스턴스를 가리키는 변수 또는 식을 사용하여 멤버 이름을 한정해야 합니다. 다음 예제 demoClass 에서는 명명 class1된 클래스의 인스턴스입니다.

Dim demoClass As class1 = New class1()  
demoClass.someSub[(argumentlist)]  

클래스 이름 자체를 사용하여 공유되지 않은 멤버를 한정할 수 없습니다. 먼저 개체 변수에서 인스턴스를 만든 다음(이 경우 demoClass) 변수 이름으로 참조해야 합니다.

클래스 또는 구조체에 멤버가 있는 Shared 경우 해당 멤버를 클래스 또는 구조체 이름 또는 인스턴스를 가리키는 변수 또는 식으로 한정할 수 있습니다.

모듈에는 별도의 인스턴스가 없으며 모든 멤버는 기본적으로 사용됩니다 Shared . 따라서 모듈 이름으로 모듈 멤버를 한정합니다.

다음 예제에서는 모듈 멤버 프로시저에 대한 정규화된 참조를 보여 줍니다. 이 예제에서는 프로젝트의 서로 다른 모듈에서 같은 이름의 두 Sub 프로시저 perform를 선언합니다. 각 모듈은 자체 모듈 내에서 한정 없이 지정할 수 있지만 다른 곳에서 참조되는 경우 정규화되어야 합니다. 최종 참조 module3perform를 한정하지 않기 때문에 컴파일러는 그 참조를 해결할 수 없습니다.

' Assume these three modules are all in the same assembly.  
Module module1  
    Public Sub perform()  
        MsgBox("module1.perform() now returning")  
    End Sub  
End Module  
Module module2  
    Public Sub perform()  
        MsgBox("module2.perform() now returning")  
    End Sub  
    Public Sub doSomething()  
        ' The following statement calls perform in module2, the active module.  
        perform()  
        ' The following statement calls perform in module1.  
        module1.perform()  
    End Sub  
End Module  
Module module3  
    Public Sub callPerform()  
        ' The following statement calls perform in module1.  
        module1.perform()  
        ' The following statement makes an unresolvable name reference  
        ' and therefore generates a COMPILER ERROR.  
        perform() ' INVALID statement  
    End Sub  
End Module  

프로젝트에 대한 참조

다른 프로젝트에 정의된 공용 요소를 사용하려면 먼저 해당 프로젝트의 어셈블리 또는 형식 라이브러리에 대한 참조 를 설정해야 합니다. 참조를 설정하려면 프로젝트 메뉴에서 참조 추가를 클릭하거나 -reference(Visual Basic) 명령줄 컴파일러 옵션을 사용합니다.

예를 들어 .NET Framework의 XML 개체 모델을 사용할 수 있습니다. System.Xml 네임스페이스에 대한 참조를 설정하면 XmlDocument 등의 클래스를 선언하고 사용할 수 있습니다. 다음 예제에서는 XmlDocument사용합니다.

' Assume this project has a reference to System.Xml  
' The following statement creates xDoc as an XML document object.  
Dim xDoc As System.Xml.XmlDocument  

포함 요소 가져오기

Imports 문(.NET 네임스페이스 및 형식)을 사용하여 사용하려는 모듈 또는 클래스가 포함된 네임스페이스를 가져올 수 있습니다. 이렇게 하면 이름을 정규화하지 않고 가져온 네임스페이스에 정의된 요소를 참조할 수 있습니다. 다음 예제에서는 이전 예제를 다시 작성하여 네임스페이스를 System.Xml 가져옵니다.

' Assume this project has a reference to System.Xml  
' The following statement must precede all your declarations.  
Imports System.Xml  
' The following statement creates xDoc as an XML document object.  
Dim xDoc As XmlDocument  

또한 이 Imports 문은 가져온 각 네임스페이스에 대한 가져오기 별칭을 정의할 수 있습니다. 이렇게 하면 소스 코드를 더 짧고 읽기 쉽게 만들 수 있습니다. 다음 예제에서는 xD 네임스페이스의 별칭으로 System.Xml를 사용하도록 이전 예제를 다시 작성합니다.

' Assume this project has a reference to System.Xml  
' The following statement must precede all your declarations.  
Imports xD = System.Xml  
' The following statement creates xDoc as an XML document object.  
Dim xDoc As xD.XmlDocument  

Imports 명령문은 다른 프로젝트의 요소를 귀하의 애플리케이션에서 사용할 수 있게 하지 않습니다. 즉, 참조를 설정하는 것을 대신하지 않습니다. 네임스페이스를 가져오면 해당 네임스페이스에 정의된 이름을 한정하기 위한 요구 사항이 제거됩니다.

문을 사용하여 Imports 모듈, 클래스, 구조체 및 열거형을 가져올 수도 있습니다. 그런 다음 이러한 가져온 요소의 멤버를 한정 없이 사용할 수 있습니다. 그러나 클래스 또는 구조체의 인스턴스로 계산되는 변수 또는 식을 사용하여 클래스 및 구조체의 공유되지 않은 멤버를 항상 한정해야 합니다.

명명 지침

이름이 같은 둘 이상의 프로그래밍 요소를 정의하면 컴파일러가 해당 이름에 대한 참조를 확인하려고 할 때 이름 모호성이 발생할 수 있습니다. 둘 이상의 정의가 범위에 있거나 범위에 정의가 없으면 참조를 해결할 수 없습니다. 예제는 이 도움말 페이지에서 "정규화된 참조 예제"를 참조하세요.

모든 요소에 고유한 이름을 지정하여 이름 모호성을 방지할 수 있습니다. 그런 다음 네임스페이스, 모듈 또는 클래스로 이름을 한정하지 않고도 모든 요소를 참조할 수 있습니다. 또한 실수로 잘못된 요소를 참조할 가능성을 줄입니다.

숨김

두 프로그래밍 요소가 동일한 이름을 공유하는 경우 그 중 하나는 다른 하나를 숨기거나 그림자로 가릴 수 있습니다. 그림자 요소를 참조할 수 없습니다. 대신 코드에서 그림자 요소 이름을 사용하는 경우 Visual Basic 컴파일러는 이를 섀도링 요소로 확인합니다. 예제에 대한 자세한 설명은 Visual Basic의 섀도링을 참조하세요.

참고하십시오