Считается ли приемлемой практикой использование модулей вместо классов с общими функциями-членами в VB.NET?
Я стараюсь избегать модулей, потому что они чувствуют, что остались от Visual Basic 6.0 и, похоже, больше не подходят. С другой стороны, кажется, нет большой разницы между использованием модуля и класса только с общими элементами. Я не так уж часто нуждаюсь в них, но иногда бывают ситуации, когда они представляют простое решение.
Мне любопытно узнать, есть ли у вас мнение или предпочтения, так или иначе.
Private
классификатор. В классе уровень защиты по умолчанию является закрытым, что может привести к путанице, если вы не знаете об этом.Ответы:
Module
s являются аналогами VB дляstatic
классов C # . Если ваш класс предназначен исключительно для вспомогательных функций и методов расширения и вы не хотите разрешать наследование и создание экземпляров , вы используете aModule
.Кстати, использование
Module
не очень субъективно и не рекомендуется . На самом деле вы должны использовать,Module
когда это уместно. .NET Framework делает это много раз (System.Linq.Enumerable
например). Чтобы объявить метод расширения, необходимо использоватьModule
s.источник
Я думаю, что стоит избегать модулей, если вы не вставляете их в отдельные пространства имен. Потому что в Intellisense методы в модулях будут видны из любого места в этом пространстве имен.
Таким образом, вместо того, чтобы
ModuleName.MyMethod()
вы в конечном итоге сMyMethod()
всплывающими окнами в любом месте, и этот вид делает недействительным инкапсуляцию. (по крайней мере, на уровне программирования).Вот почему я всегда пытаюсь создать Class с разделяемыми методами, кажется намного лучше.
источник
Модули ни в коем случае не являются устаревшими и интенсивно используются на языке VB. Это единственный способ, например, реализовать метод расширения в VB.Net.
Существует одно огромное различие между модулями и классами со статическими членами. Любой метод, определенный в модуле, доступен глобально, если модуль доступен в текущем пространстве имен. В сущности, модуль позволяет вам определять глобальные методы. Это то, чего не может сделать класс, имеющий только общих членов.
Вот быстрый пример, который я часто использую при написании кода VB, который взаимодействует с необработанными интерфейсами COM.
источник
Это приемлемо для использования
Module
.Module
не используется в качестве заменыClass
.Module
служит своей цели. ЦельюModule
является использование в качестве контейнера дляClass
, илиClass
.Module
не как,Class
так как вы не можетеModule
,Interface
сModule
,Module
.К чему-либо внутри
Module
можно получить прямой доступ кModule
сборке, не обращаясь кModule
ее имени. По умолчанию уровень доступа для aModule
естьFriend
.источник
Классы
Модули
источник
Когда один из моих классов VB.NET имеет всех общих членов, я либо преобразую его в модуль с соответствующим (или иным образом соответствующим) пространством имен, либо делаю класс не наследуемым и не конструируемым:
источник
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()
в модуле он работает в ином порядке, чем в классе, просто исходя из того, что мне пришлось переместить некоторые объявления во внутренние методы извне, чтобы избежать ошибки.источник