선언된 하나 이상의 프로그래밍 요소가 클래스 또는 구조체의 특정 인스턴스가 아닌 큰 클래스 또는 구조체와 연결되도록 지정합니다.
공유 사용 시기
클래스 또는 구조체의 멤버를 공유하면 각 인스턴스가 자체 복사본을 유지하는 공유 가 아닌 모든 인스턴스에서 사용할 수 있습니다. 예를 들어 변수 값이 전체 애플리케이션에 적용되는 경우 공유가 유용합니다. 해당 변수를 Shared선언하면 모든 인스턴스가 동일한 스토리지 위치에 액세스하고 한 인스턴스가 변수의 값을 변경하면 모든 인스턴스가 업데이트된 값에 액세스합니다.
공유는 멤버의 액세스 수준을 변경하지 않습니다. 예를 들어 클래스 멤버는 공유 및 비공개(클래스 내에서만 액세스할 수 있음) 또는 비공유 및 퍼블릭일 수 있습니다. 자세한 내용은 Visual Basic의 액세스 수준을 참조하세요.
규칙
선언 컨텍스트입니다. 모듈 수준에서만 사용할
Shared수 있습니다. 즉, 요소의 선언 컨텍스트는Shared클래스 또는 구조체여야 하며 소스 파일, 네임스페이스 또는 프로시저일 수 없습니다.결합된 한정자입니다. 동일한 선언에서 재정의, 재정의 가능, NotOverridable, MustOverride 또는 Static과 함께 지정할
Shared수 없습니다.액세스. 공유 요소는 해당 클래스 또는 구조체의 특정 인스턴스의 변수 이름이 아닌 해당 클래스 또는 구조체 이름으로 한정하여 액세스합니다. 공유 멤버에 액세스하기 위해 클래스 또는 구조체의 인스턴스를 만들 필요가 없습니다.
다음 예제에서는 구조체에 의해 노출되는 공유 프로시저 IsNaN 를 호출합니다 Double .
If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")암시적 공유. Const 문에서는 한정자를 사용할
Shared수 없지만 상수는 암시적으로 공유됩니다. 마찬가지로 모듈 또는 인터페이스의 멤버를 선언할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 정자는 다음 컨텍스트에서 사용할 수 있습니다.
참고하십시오
.NET