[vb.net] VB.NET의 클래스와 모듈

VB.NET에서 공유 멤버 함수가있는 클래스 대신 모듈을 사용하는 것이 허용 가능한 방법으로 간주됩니까?

모듈은 Visual Basic 6.0에서 남은 것처럼 느껴지고 더 이상 적합하지 않기 때문에 모듈을 피하는 경향이 있습니다. 반면, 공유 멤버 만있는 모듈과 클래스를 사용하는 경우에는 큰 차이가없는 것 같습니다. 내가 정말로 많은 것을 필요로하는 것은 아니지만, 때로는 그들이 간단한 해결책을 제시하는 상황이 있습니다.

당신이 어떤 식 으로든 의견을 가지고 있는지 궁금합니다.



답변

ModuleC # static클래스에 대응하는 VB 입니다. 클래스가 헬퍼 함수 및 확장 메소드 전용으로 설계되었으며 상속인스턴스화 를 허용 하지 않으 려면을 사용하십시오 .Module

그건 그렇고, 사용 Module은 실제로 주관적 이지 않으며 더 이상 사용되지 않습니다 . 실제로 Module적절한 경우 를 사용해야합니다 . .NET Framework 자체는 여러 번 수행합니다 ( System.Linq.Enumerable예 :). 확장 메소드를 선언하려면 Modules 를 사용해야 합니다.


답변

모듈을 별도의 네임 스페이스에 붙이지 않는 한 모듈을 피하는 것이 좋습니다. Intellisense에서 모듈의 네임 스페이스의 모든 위치에서 모듈의 메소드를 볼 수 있기 때문입니다.

따라서 대신 어디에서나 팝업으로 ModuleName.MyMethod()끝나고 MyMethod()캡슐화가 무효화됩니다. (적어도 프로그래밍 수준에서).

그렇기 때문에 항상 공유 메서드를 사용하여 클래스를 만들려고 시도하는 것이 훨씬 좋습니다.


답변

모듈은 더 이상 사용되지 않으며 VB 언어로 많이 사용됩니다. VB.Net에서 확장 메소드를 구현하는 유일한 방법입니다.

정적 멤버가있는 모듈과 클래스에는 큰 차이가 있습니다. 현재 네임 스페이스에서 모듈을 사용할 수있는 한 모듈에 정의 된 모든 메소드에 액세스 할 수 있습니다. 실제로 모듈을 사용하면 전역 메소드를 정의 할 수 있습니다. 공유 멤버 만있는 클래스는 수행 할 수없는 작업입니다.

다음은 원시 COM 인터페이스와 상호 작용하는 VB 코드를 작성할 때 많이 사용하는 간단한 예입니다.

Module Interop
  Public Function Succeeded(ByVal hr as Integer) As Boolean
    ...
  End Function

  Public Function Failed(ByVal hr As Integer) As Boolean
    ...
  End Function
End Module

Class SomeClass
  Sub Foo()
    Dim hr = CallSomeHrMethod()
    if Succeeded(hr) then
      ..
    End If
  End Sub
End Class


답변

사용할 수 있습니다 Module. Module의 대체품으로 사용되지 않습니다 Class. Module자체 목적을 수행합니다. 의 목적은 Module컨테이너로 사용하는 것입니다

  • 확장 방법,
  • 특정 변수가 아닌 변수 Class또는
  • 에 맞지 않는 변수 Class.

Module유사한되지 않습니다 Class때문에 당신은 할 수 없습니다

  • 에서 상속 Module,
  • 구현 InterfaceA를을 Module,
  • 의 인스턴스를 만들 수도 없습니다 Module.

내부 뭐든지 Module직접 내에서 액세스 할 수 있습니다 Module을 참조하지 않고 조립 Module이름으로. 기본적으로 a의 액세스 수준 ModuleFriend입니다.


답변

클래스

  • 클래스는 객체 로 인스턴스화 될 수 있습니다
  • 인스턴스화 된 각 개체마다 개체 데이터가 별도로 존재합니다.
  • 클래스는 인터페이스구현할 수 있습니다 .
  • 클래스 내에 정의 된 멤버는 클래스 의 특정 인스턴스 내에서 범위지정 되며 개체 수명 동안 만 존재 합니다 .
  • 클래스 외부에서 클래스 멤버에 액세스하려면 Object.Member 형식의 완전한 이름사용해야 합니다.

모듈

  • 모듈 은 객체로 인스턴스화 할 수 없습니다 . 표준 모듈 데이터의 사본이 하나만 있기 때문에 프로그램의 한 부분이 표준 모듈의 공용 변수를 변경하면 전체 프로그램에서 볼 수 있습니다.
  • 모듈 내에 선언 된 멤버는 기본적 으로 공개적으로 액세스 할 수 있습니다 .
  • 모듈에 액세스 할 수있는 모든 코드로 액세스 할 수 있습니다.
  • 즉, 표준 모듈의 변수는 프로젝트의 어느 곳에서나 볼 수 있고 프로그램 수명 동안 존재하기 때문에 효과적으로 전역 변수입니다.

답변

내 VB.NET 클래스 중 하나에 모든 공유 멤버가 있으면 일치하는 (또는 다른 적절한) 네임 스페이스가있는 모듈로 변환하거나 클래스를 상속 할 수없고 구성 할 수 없습니다.

Public NotInheritable Class MyClass1

   Private Sub New()
      'Contains only shared members.
      'Private constructor means the class cannot be instantiated.
   End Sub

End Class


답변

모듈은 열거 형과 일부 전역 변수, 상수 및 공유 함수를 저장하는 데 적합합니다. 그것의 아주 좋은 것 그리고 나는 종종 그것을 사용합니다. 선언 된 변수는 전체 프로젝트에서 볼 수 있습니다.