VB.NET에서 클래스 정적 표시


85

최근 질문답변 에서 언급했듯이 정적 클래스에서 상속 할 수 없습니다. VB.NET 내부의 정적 클래스와 함께 사용되는 규칙을 어떻게 적용합니까? 프레임 워크는 C #과 VB간에 호환되므로 클래스를 정적으로 표시하는 방법이있을 수 있지만 방법이없는 것 같습니다.

답변:


121

모듈 == 정적 클래스

상속 할 수없는 클래스를 원하면 클래스를 사용하십시오 NotInheritable. 하지만 정적 / 공유되지 않습니다. 모든 메서드, 속성 및 멤버를으로 표시 할 수 Shared있지만 컴파일러에 의해 적용되지 않기 때문에 C #의 정적 클래스와 완전히 동일하지는 않습니다.

C # 정적 클래스에 해당하는 VB.Net을 실제로 원하는 경우 Module. 상속 될 수 없으며 모든 멤버, 속성 및 메서드는 정적 / 공유입니다.


2
이전 댓글을 철회합니다. 나는 반사경에있는 모듈을보고 있었는데 IL은 그것을 밀봉 된 것으로 보여줍니다.
MagicKat

27
당신은 VBer입니까? 모듈은 네임 스페이스와 같습니다. 모든 VB 기능은 VB의 모듈에서 가져 오며 일반 범위에서 사용할 수 있습니다. 제 생각에 vb의 정적 클래스는 모듈이 아니라 다른 동작을 가지고 있습니다. vb에서 '정적 클래스'동작을 원하면 C #의 정적 클래스에서 수행해야하는 것처럼 NotInheritable이 있어야하며 모든 멤버의 'Shared'를 선언해야합니다. 그들은 동일하게 동작합니다. 모듈 NOT.
Shimmy Weitzhandler

2
@Shimmy 전에이 댓글을 어떻게 놓쳤는 지 모르겠지만 당신은 잘못되었습니다. 생성 된 IL을 보면 모듈이 정적 클래스와 똑같은 처리를받습니다. VB는 이전 표준 기능에 대한 추가 작업을 수행하여 전역 범위에 표시되도록합니다.
Joel Coehoorn

2
@JoelCoehoorn 모듈 ≈≈ 정적 클래스는 모듈이 네임 스페이스에서 직접 선언되어야하기 때문입니다. 이는 모듈이나 클래스에서 모듈을 선언 할 수 없음을 의미합니다.
LosManos

20
@JoelCoehoorn 모듈과 정적 클래스가 동일한 IL로 끝났다는 사실은 알 수 있지만 VB는 추가 로 모듈의 멤버를 포함하는 네임 스페이스로 승격 합니다. 추진 모듈 및 정적 클래스 방대한 차이점 사용상 IMHO 다를 여기서 양태이다. 나는 NotInheritable-빈 개인 생성자-모든 멤버 공유 솔루션을 선호합니다. 멤버는 클래스를 통해서만 도달 할 수 있기 때문에 정적 클래스 동등성을 얻으려는 경우 훨씬 더 정확한 동작입니다. IL은 다를 수 있지만 실제로는 학문적입니다.
misha256 2014

51

거의 다 왔어. 인스턴스화도 방지해야합니다.

NotInheritable Class MyStaticClass

    ''' <summary>
    ''' Prevent instantiation.
    ''' </summary>
    Private Sub New()

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Shared는 정적 클래스의 메서드와 같습니다.
  • NotInheritable은 봉인 된 것과 같습니다.
  • Private New는 정적 클래스를 인스턴스화 할 수없는 것과 같습니다.

참조 :
MSDN-정적 클래스 및 정적 클래스 멤버


2
왜 이것이 허용되지 않는 대답입니까? 코드 주셔서 감사합니다 싹둑
ArcherBird

6

상속 할 수없는 클래스를 만들려는 경우 C #에서는 Sealed를 사용하고 VB.Net에서는 NotInheritable을 사용할 수 있습니다.

정적에 해당하는 VB.Net은 공유됩니다.


C # 정적 클래스에서해야하는 것처럼 변수와 기능을 공유로 표시합니다. NotInheritable로 표시하면 봉인됩니다.
Shimmy Weitzhandler

5

vb.net에서 정적 클래스를 만들 수 있습니다. 해결책은

Friend NotInheritable Class DB
    Public Shared AGE As Integer = 20
End Class

AGE 변수는 공개 정적이므로 다음과 같이 다른 코드에서 사용할 수 있습니다.

 Dim myage As Integer = DB.AGE

친구 = 공개, NotInheritable = 정적


3
! 친구 = 대중은, 친구는 내부 =
알테어

1
! 밀봉 NotInheritable = 정적, NotInheritable ==
매그너스

! myAge라는 = 20 (더 이상, 슬프게도)
저승

2

CLR 관점에서 C # 정적 클래스는 "봉인 된"클래스와 "추상적 인"클래스입니다. 추상이기 때문에 인스턴스를 만들 수 없으며 봉인되어 있기 때문에 상속 할 수 없습니다. 나머지는 컴파일러 마법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.