Shared(Visual Basic)

선언된 하나 이상의 프로그래밍 요소가 클래스 또는 구조체의 특정 인스턴스가 아닌 큰 클래스 또는 구조체와 연결되도록 지정합니다.

공유 사용 시기

클래스 또는 구조체의 멤버를 공유하면 각 인스턴스가 자체 복사본을 유지하는 비공유 인스턴스가 아닌 모든 인스턴스에서 사용할 수 있습니다. 예를 들어 변수 값이 전체 애플리케이션에 적용되는 경우 공유가 유용합니다. 해당 변수를 Shared(으)로 선언하면 모든 인스턴스가 동일한 스토리지 위치에 액세스하고 한 인스턴스가 변수의 값을 변경하면 모든 인스턴스가 업데이트된 값에 액세스합니다.

공유는 멤버의 액세스 수준을 변경하지 않습니다. 예를 들어 클래스 멤버는 공유 및 비공개(클래스 내에서만 액세스할 수 있음) 또는 비공유 및 퍼블릭일 수 있습니다. 자세한 내용은 Visual Basic의 액세스 수준을 참조하세요.

규칙

  • 선언 컨텍스트. Shared는 모듈 수준에서만 사용할 수 있습니다. 즉, Shared 요소의 선언 컨텍스트는 클래스 또는 구조체여야 하며 소스 파일, 네임스페이스 또는 프로시저일 수 없습니다.

  • 결합된 한정자. 동일한 선언에서 SharedOverrides, Overridable, NotOverridable, MustOverride 또는 Static과 함께 지정할 수 없습니다.

  • 액세스. 공유 요소는 해당 클래스 또는 구조체의 특정 인스턴스의 변수 이름이 아닌 해당 클래스 또는 구조체 이름으로 한정하여 액세스합니다. 공유 멤버에 액세스하기 위해 클래스 또는 구조체의 인스턴스를 만들 필요가 없습니다.

    다음 예에서는 Double 구조체에 의해 노출되는 공유 프로시저 IsNaN을(를) 호출합니다.

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • 암시적 공유. Shared 한정자는 Const 문에서 사용할 수 없지만 상수는 암시적으로 공유됩니다. 마찬가지로 모듈 또는 인터페이스의 멤버를 Shared(으)로 선언할 수는 없지만 암시적으로 공유됩니다.

동작

  • 저장. 공유 변수 또는 이벤트는 클래스 또는 구조체를 만드는 인스턴스 수 또는 몇 개에 관계없이 메모리에 한 번만 저장됩니다. 마찬가지로 공유 프로시저 또는 속성은 하나의 지역 변수 집합만 보유합니다.

  • 인스턴스 변수를 통해 액세스 해당 클래스 또는 구조체의 특정 인스턴스를 포함하는 변수의 이름으로 한정하여 공유 요소에 액세스할 수 있습니다. 일반적으로 예상대로 작동하지만 컴파일러는 경고 메시지를 생성하고 변수 대신 클래스 또는 구조체 이름을 통해 액세스합니다.

  • 인스턴스 식을 통해 액세스 클래스 또는 구조체의 인스턴스를 반환하는 식을 통해 공유 요소에 액세스하는 경우 컴파일러는 식을 평가하는 대신 클래스 또는 구조체 이름을 통해 액세스합니다. 이 액세스는 다른 작업을 수행하고 인스턴스를 반환하도록 식을 의도한 경우 예기치 않은 결과를 생성합니다. 다음 예제에서는 이 상황을 보여 줍니다.

    Sub Main()
        ' The following line is the preferred way to access Total.
        ShareTotal.Total = 10
    
        ' The following line generates a compiler warning message and
        ' accesses total through class ShareTotal instead of through
        ' the variable instanceVar. This works as expected and adds
        ' 100 to Total.
        Dim instanceVar As New ShareTotal
        instanceVar.Total += 100
    
        ' The following line generates a compiler warning message and
        ' accesses total through class ShareTotal instead of calling
        ' ReturnClass(). This adds 1000 to total but does not work as
        ' expected, because the WriteLine in ReturnClass() does not run.
        Console.WriteLine("Value of total is " & CStr(ShareTotal.Total))
        ReturnClass().Total += 1000
    End Sub
    
    Public Function ReturnClass() As ShareTotal
        Console.WriteLine("Function ReturnClass() called")
        Return New ShareTotal
    End Function
    
    Public Class ShareTotal
        Public Shared Property Total As Integer
    End Class
    

    앞의 예제에서 컴파일러는 코드가 인스턴스를 통해 Total 공유 속성에 액세스하는 두 번 모두 경고 메시지를 생성합니다. 각 경우에서 클래스 ShareTotal을(를) 통해 직접 액세스하게 되며 인스턴스를 사용하지 않습니다. 프로시저 ReturnClass에 대한 의도된 호출의 경우 ReturnClass에 대한 호출도 생성하지 않으므로 "함수 ReturnClass()가 호출됨"을 표시하는 추가 작업이 수행되지 않습니다.

Shared 한정자는 다음 컨텍스트에서 사용할 수 있습니다.

참고 항목