Ключевое слово Module в VB.NET в основном существует для совместимости с VB6 и более ранними версиями.В то время большая часть кода VB была процедурной с автономными подпрограммами и функциями, не относящимися к классу.Язык получил ключевое слово Class где-то около VB4.Не истинные классы в смысле ООП, они не поддерживают наследование.Функция отсутствует в базовой архитектуре 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 также не имеет понятия о статических классах.Есть много веских причин для статических классов, идея «Модуль» не устарела.Вы можете сделать то же самое, объявив NotInheritable Class в коде VB.NET, используя только общие методы.Компилятор VB.NET, однако, не предписывает использование методов Shared, как это делает компилятор C #, и не позволяет объявлять класс закрытым.Таким образом, модуль просто отлично.