Классы и модули в VB.NET



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



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



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

606   8  

8 ответов:

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

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

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

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

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

модули ни в коем случае не являются устаревшими и широко используются на языке 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

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

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

Module не нравится Class так как вы не можете

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

что внутри Module может быть непосредственно доступен в Module сборка без ссылки на Module на его имя. По умолчанию уровень доступа для 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

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

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

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

поэтому я просто бросил EmbeddedAssembly.Load и AddHandler AppDomain.CurrentDomain.AssemblyResolve линии и Боб стал моим дядей.

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

Comments

    Ничего не найдено.