VB.NET의 Module 키워드는 주로 VB6 및 이전 버전과의 호환성을 위해 존재합니다. 그 당시 대부분의 VB 코드는 독립 서클이 아닌 클래스 하위 및 함수로 절차 적이었습니다. 언어는 VB4 어딘가에서 Class 키워드를 획득했습니다. OOP 의미에서 참된 클래스는 아니지만 상속을 지원하지 않았습니다. 기본 COM 아키텍처에없는 기능입니다.
CLR에서 제공하는 실행 모델과 잘 맞지 않습니다. 무료 함수를 지원하지 않으므로 모든 메소드가 클래스의 멤버 여야합니다. VB.NET 컴파일러는 클래스를 선언하여 모듈을 에뮬레이트합니다. 모듈 프로시 저는 해당 클래스의 공유 메서드가됩니다. 당신은 Ildasm.exe를 함께이 볼 수없는 코드는 모듈에서 클래스를 파생 할 수 없도록 그 코드는, 그것에 대한 참조를 가져, 밀봉 수 있도록 그것은 개인이 얼마나
.class private auto ansi sealed ConsoleApplication1.Module1
extends [mscorlib]System.Object
{
.custom instance void [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute::.ctor() = (01 00 00 00)
} // end of class ConsoleApplication1.Module1
참고.
C# 컴파일러는 "정적 클래스"와 똑같은 작업을 수행하지만 CLR에는 정적 클래스 개념이 없습니다. 정적 클래스에는 많은 이유가 있지만, "모듈"에 대한 아이디어는 더 이상 사용되지 않습니다. VB.NET 코드에서 NotInheritable 클래스를 선언하고 Shared 메서드 만 사용하여 동일한 결과를 얻을 수 있습니다. 그러나 VB.NET 컴파일러는 C# 컴파일러처럼 메소드를 공유하도록 강요하지 않으며 클래스를 private로 선언 할 수 없습니다. 따라서 모듈은 훌륭합니다.
답변 해 주셔서 감사합니다.Extension 메서드에 대해서는 들어 보지 못했지만 모듈로만 수행 할 수 있음을 알았습니다. 물론이 질문에 대한 답변은 있지만 프로그램의 구조와 모듈 사용에 대해 더 염려했습니다. –