답변:
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의 액세스 수준 Module은 Friend입니다.
클래스
모듈
내 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
Imports <whatever>당신은 어떤 수입이있는 경우, Namespace MyCoolModule, Public Module MyCoolModule, <멤버 없이 Shared >, End Module, End Namespace.
당신은 있어야 당신이 확장 방법을 만드는 경우 (오히려 급 이상) 모듈을 사용합니다. VB.NET에서는 다른 옵션을 알지 못합니다.
모듈 자체에 강하기 때문에 보일러 Sub New()모듈 코드를 추가하여 임베디드 어셈블리를 한 번에 해결하는 방법을 모색하는 데 몇 시간이 걸렸습니다. (모듈)과 Shared Sub New()(클래스)가 같은지 알았습니다. (나는 모듈에 호출 가능한 것이 있다는 것을 몰랐다 Sub New()!)
그래서 난 그냥 던져 EmbeddedAssembly.Load및 AddHandler AppDomain.CurrentDomain.AssemblyResolve거기에 선을 밥 삼촌이되었다.
부록 : 아직 100 % 체크 아웃하지는 않았지만 Sub New()클래스와 모듈에서 다른 순서로 실행 되는 잉크 링이 있습니다 . 단지 피하기 위해 선언을 외부에서 내부 메소드로 옮겨야한다는 사실에 의해 진행됩니다. 오류.
Private입니다. 즉, 규정 자를 명시 적으로 추가하는 것을 잊어 버린 경우 실수로 메소드를 사용할 수 있습니다 . 클래스에서 기본 보호 수준은 개인 수준이므로 알지 못하는 경우 혼동 될 수 있습니다.