Объявите глобальные переменные в Visual Studio 2010 и VB.NET - PullRequest
37 голосов
/ 25 декабря 2010

Как объявить глобальную переменную в Visual Basic?

Эти переменные должны быть доступны из всех форм Visual Basic.Я знаю, как объявить открытую переменную для конкретной формы, но как мне сделать это для всех форм в моем проекте?

Ответы [ 13 ]

71 голосов
/ 25 декабря 2010

Невозможно объявить глобальные переменные, как вы, вероятно, представляете их в VB.NET.

То, что вы можете сделать (как некоторые издругие ответы предлагали) объявлять все, что вы хотите рассматривать как глобальные переменные, а не статические переменные внутри одного конкретного класса:

Public Class GlobalVariables
    Public Shared UserName As String = "Tim Johnson"
    Public Shared UserAge As Integer = 39
End Class

Однако вам нужно будет полностью квалифицировать все ссылки на эти переменныевезде, где вы хотите использовать их в своем коде.В этом смысле они не относятся к типу глобальных переменных, с которыми вы, возможно, знакомы по другим языкам, поскольку они все еще связаны с каким-то конкретным классом.

Например, если вы хотите отобразить окно сообщения вКод вашей формы с именем пользователя, вам нужно сделать что-то вроде этого:

Public Class Form1 : Inherits Form

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        MessageBox.Show("Hello, " & GlobalVariables.UserName)
    End Sub

End Class

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


Если практика полной квалификации ваших переменных ужасает или расстраивает вас по какой-либо причине, вы всегда можете импортировать класс, содержащий вашиобъявления глобальных переменных (здесь GlobalVariables) вверху каждого файла кода (или даже на уровне проекта, в окне свойств проекта).Затем вы можете просто ссылаться на переменные по их именам.

Imports GlobalVariables

Обратите внимание, что это точно то же самое, что компилятор делает для вас за кулисами, когда вы объявляетеваши глобальные переменные в Module, а не Class.В VB.NET, который предлагает модули для целей обратной совместимости с предыдущими версиями VB, Module - это просто запечатанный статический класс (или, в терминах VB.NET, Shared NotInheritable Class).Среда IDE позволяет вызывать участников из модулей без полной квалификации или импорта ссылки на них.Даже если вы решите пойти по этому пути, стоит понять, что происходит за кулисами в объектно-ориентированном языке, таком как VB.NET.Я думаю, что как программисту важно понимать, что происходит и что именно ваши инструменты делают для вас, даже если вы решите их использовать.И что бы это ни стоило, я не рекомендую это как «лучшую практику», потому что я чувствую, что это имеет тенденцию к неясности и чистому объектно-ориентированному коду / дизайну.Гораздо более вероятно, что программист C # поймет ваш код, если он написан так, как показано выше, чем если вы поместите его в модуль и позволите компилятору обрабатывать все.


Обратите внимание, что, как упоминался хотя бы еще один ответ, VB.NET является полностью объектно-ориентированным языком.Это означает, среди прочего, что все является объектом.Даже «глобальные» переменные должны быть определены в экземпляре класса, потому что они также являются объектами.Каждый раз, когда вы чувствуете необходимость использовать глобальные переменные в объектно-ориентированном языке, это признак того, что вам нужно переосмыслить свой дизайн.Если вы просто переключаетесь на объектно-ориентированное программирование, вам стоит остановиться и изучить некоторые базовые шаблоны, прежде чем углубляться в написание кода.

21 голосов
/ 25 декабря 2010

Практически так же, как и всегда, с «Модулями» вместо классов и просто используйте «Public» вместо старого «Global»:

Public Module Module1
    Public Foo As Integer
End Module
6 голосов
/ 12 мая 2013

Хорошо. Я наконец нашел, что на самом деле работает, чтобы ответить на вопрос, который кажется заданным;

«Когда мне нужно много модулей и форм, как я могу объявить переменную как общедоступную для всех из них, чтобы каждый из них ссылался на одну и ту же переменную?»

Удивительно для меня, но я потратил немало времени на поиск в Интернете этого, казалось бы, простого вопроса, не найдя ничего, кроме неопределенности, которая оставляла мне все еще ошибки.

Но благодаря ссылке Коди Грея на пример я смог найти правильный ответ;


Положение ; У вас есть несколько модулей и / или форм, и вы хотите сослаться на определенную переменную из каждого или всех.

«А» способ, который работает; В одном модуле поместите следующий код (где «DefineGlobals» - произвольно выбранное имя);

Public Module DefineGlobals

Public Parts As Integer                 'Assembled-particle count
Public FirstPrtAff As Long              'Addr into Link List 
End Module

И затем в каждом модуле / форме, нуждающихся в обращении к этой переменной «Parts», поместите следующий код (как пример формы «InitForm2»);

Public Class InitForm2
Private Sub InitForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Parts = Parts + 3

End Sub

End Class

И, возможно, другая форма; Открытый класс FormX

Sub CreateAff()

   Parts = 1000

End Sub 

 End Class

Этот тип кодирования, по-видимому, работал на моем VB2008 Express и, похоже, на данный момент все необходим (без каких-либо неизвестных файлов, загружаемых в фоновом режиме), хотя я не нашел конца "О, кстати ... неожиданные детали. И я уверен, что более высокая степень стандартизации предпочтительнее, но первая задача - просто заставить что-то работать вообще, со стандартами или без них.

Ничто не сравнится с точным и хорошо сформулированным, явным примерами.

Еще раз спасибо, Коди

3 голосов
/ 25 декабря 2010

Сделать статичным (используется в VB).

Public Class Form1

   Public Shared SomeValue As Integer = 5

End Class
2 голосов
/ 25 декабря 2010

Публичные переменные - это запах кода - попробуйте изменить дизайн приложения, чтобы они были , а не .Большинство рассуждений здесь и здесь применимы к VB.NET.

Самый простой способ иметь глобальные переменные в VB.NET - это создание открытых статических переменныхв классе (объявите переменную как Public Shared).

1 голос
/ 21 октября 2015

небольшое замечание: я использую модули в веб-приложении (asp.net). Мне нужно помнить, что все, что я храню в переменных в модуле, видны всем в приложении, читайте веб-сайт. Не только в моей сессии. Если я пытаюсь добавить вычисление в мою сессию, мне нужно создать массив для фильтрации чисел для моей сессии и для других. Модули - отличный способ работать, но нужно сосредоточиться на том, как их использовать.

Чтобы помочь от ошибок: занятия отправляются на

CarbageCollector

когда страница закончена. Мои модули остаются живыми (до тех пор, пока приложение не будет завершено или перезапущено), и я могу повторно использовать данные в нем. Я использую это для сохранения данных, которые иногда теряются из-за обработки сеансов IIS.

IIS Form auth

и

IIS_session

не синхронизированы, и с моим модулем я извлекаю данные, которые прошли через клифф.

1 голос
/ 13 апреля 2013

Глобальная переменная может быть доступна во всех ваших формах в вашем проекте, если вы используете ключевое слово public shared, если оно находится в классе.Это также будет работать, если вы используете ключевое слово "public", если оно находится в модуле, но по многим причинам это не лучшая практика.

(... Да, я несколько повторяю то, что "Cody Grey"и "RBarryYoung" сказал.)

Одна из проблем заключается в том, что у вас есть два потока, которые вызывают одну и ту же глобальную переменную одновременно.У вас будет несколько сюрпризов.У вас могут быть неожиданные реакции, если вы не знаете их ограничений.Взгляните на статью Глобальные переменные в Visual Basic .NET и загрузите пример проекта!

0 голосов
/ 26 декабря 2018

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

My.Settings.(Name of variable)

Это будет работать для всего проекта во всех формах

0 голосов
/ 20 марта 2016

Всего вышеперечисленного можно избежать, просто объявив значение друга для среды выполнения в начальной форме.

Public Class Form1 
Friend sharevalue as string = "Boo"

Затем получите доступ к этой переменной из всех форм, просто используя Form1.sharevalue

0 голосов
/ 09 декабря 2014

Различные ответы в этом блоге, по-видимому, определяются SE, которые способствуют строгому соблюдению обычных правил объектно-ориентированного программирования (используйте Public Class с общедоступным общим доступом (он же статическим) и полностью квалифицированными ссылками на классы, или SEкто продвигает использование функции обратной совместимости (Модуль), для которой компилятору, очевидно, нужно сделать то же самое, чтобы заставить его работать.

Как SE с 30-летним опытом, я бы предложил следующие рекомендации:

  1. Если вы пишете весь новый код (не пытаясь преобразовать унаследованное приложение), который вы вообще избегаете использовать эти формы, за исключением редкого случая, когда вам действительно требуется статическая переменная,потому что они могут вызвать ужасные последствия (и действительно трудно найти ошибки). (Для многопоточного и многопроцессорного кода требуются семафоры вокруг статических переменных ...)

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

  3. Если у вас огромное унаследованное приложение с десятками или сотнями глобальных переменных, непременно используйте Модули для их определения.Нет смысла тратить время на то, чтобы заставить приложение работать, потому что вы, вероятно, уже отстаете от 8 балов, потраченных на свойства и т. Д.

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