Классы против модулей в VB.NET - PullRequest
153 голосов
/ 19 мая 2009

Считается ли приемлемой практикой использование модулей вместо классов с общими функциями-членами в VB.NET?

Я стараюсь избегать модулей, потому что они чувствуют, что остатки остались от Visual Basic 6.0 и больше не подходят. С другой стороны, кажется, нет большой разницы между использованием модуля и класса только с общими элементами. Я не так уж часто нуждаюсь в них, но иногда бывают ситуации, когда они представляют простое решение.

Мне любопытно узнать, есть ли у вас мнение или предпочтения, так или иначе.

Ответы [ 8 ]

201 голосов
/ 19 мая 2009

Module s являются аналогами VB классов C # static. Если ваш класс предназначен исключительно для вспомогательных функций и методов расширения и вы не хотите разрешить наследование и инстанцирование , вы используете Module.

Кстати, использование Module на самом деле не субъективно и не рекомендуется . На самом деле вы должны использовать Module, когда это уместно. .NET Framework делает это много раз (например, System.Linq.Enumerable). Чтобы объявить метод расширения, необходимо использовать Module s.

30 голосов
/ 19 мая 2009

Я думаю, что стоит избегать модулей, если вы не вставляете их в отдельные пространства имен. Потому что в Intellisense методы в модулях будут видны из любого места в этом пространстве имен.

Таким образом, вместо ModuleName.MyMethod() вы в конечном итоге получите MyMethod() всплывающих окон в любом месте, и этот вид аннулирует инкапсуляцию (по крайней мере, на уровне программирования).

Вот почему я всегда пытаюсь создать Class с общими методами, кажется, намного лучше.

25 голосов
/ 19 мая 2009

Модули ни в коем случае не являются устаревшими и интенсивно используются на языке VB. Это единственный способ, например, реализовать метод расширения в VB.Net.

Существует огромная разница между модулями и классами со статическими членами. Любой метод, определенный в модуле, доступен глобально, если модуль доступен в текущем пространстве имен. По сути, модуль позволяет вам определять глобальные методы. Это то, чего не может сделать класс, имеющий только общих членов.

Вот быстрый пример, который я часто использую при написании VB-кода, который взаимодействует с необработанными интерфейсами COM.

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
9 голосов
/ 16 июля 2014

Классы

  • классы могут быть созданы как объекты
  • Данные объекта существуют отдельно для каждого экземпляра объекта.
  • классы могут реализовывать интерфейсы .
  • Члены, определенные в классе, находятся в пределах определенного экземпляра класса и существуют только в течение времени жизни объекта .
  • Чтобы получить доступ к членам класса извне класса, вы должны использовать полные имена в формате Object.Member .

Модули

  • Модули не могут быть созданы как объекты , поскольку существует только одна копия данных стандартного модуля, когда одна часть вашей программы изменяет открытую переменную в стандартном модуле, она будет видна всем программа.
  • Члены, объявленные в модуле, по умолчанию общедоступны .
  • Доступ к нему может получить любой код, который может получить доступ к модулю.
  • Это означает, что переменные в стандартном модуле по сути являются глобальными переменными, потому что они видны из любой точки вашего проекта и существуют в течение всей жизни программы.
9 голосов
/ 13 января 2014

Допустимо использовать Module. Module не используется в качестве замены Class. Module служит своей цели. Цель Module - использовать в качестве контейнера для

  • методы расширения,
  • переменные, которые не являются специфичными для Class или
  • переменные, которые не помещаются должным образом ни в одну Class.

Module не похож на Class, так как вы не можете

  • наследуется от Module,
  • реализовать Interface с Module,
  • и не создавайте экземпляр Module.

Все, что находится внутри Module, может быть непосредственно доступно в сборке Module без ссылки на Module по его названию. По умолчанию уровень доступа для Module составляет Friend.

6 голосов
/ 12 марта 2011

Когда в одном из моих классов 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
0 голосов
/ 12 апреля 2017

Вы должны использовать модуль (а не класс), если вы создаете методы расширения. В VB.NET я не знаю другого варианта.

Будучи сам по себе устойчивым к модулям, я потратил пару часов, пытаясь понять, как добавить шаблонный код, чтобы разрешить встроенные сборки в одном, только чтобы выяснить, что Sub New() (Модуль) и Shared Sub New() ( Класс) эквивалентны. (Я даже не знал, что было вызываемым Sub New() в модуле!)

Так что я просто бросил туда строки EmbeddedAssembly.Load и AddHandler AppDomain.CurrentDomain.AssemblyResolve, и Боб стал моим дядей.

Приложение : я еще не проверил это на 100%, но у меня есть предположение, что Sub New() работает в модуле в другом порядке, чем класс, просто исходя из того, что я пришлось избегать перемещения некоторых объявлений во внутренние методы извне.

0 голосов
/ 11 апреля 2017

Модули отлично подходят для хранения перечислений и некоторых глобальных переменных, констант и общих функций. это очень хорошая вещь, и я часто использую это. Объявленные переменные видны по всему проекту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...