Подтвердить что ты не робот

Объявлять глобальные переменные в Visual Studio 2010 и VB.NET

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

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

4b9b3361

Ответ 1

Невозможно объявить глобальные переменные, как вы, вероятно, представляете их в 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. Я думаю, что как программисту важно понимать, что происходит и что именно ваши инструменты делают для вас, даже если вы решите их использовать. И что бы это ни стоило, я не рекомендую это как "лучшую практику", потому что я чувствую, что это имеет тенденцию к неясности и чистому объектно-ориентированному коду/дизайну. Гораздо более вероятно, что программист С# поймет ваш код, если он написан так, как показано выше, чем если вы втиснете его в модуль и позволите компилятору обрабатывать все.


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

Ответ 2

Совсем так же, как и у вас всегда, с "Модулями" вместо классов и просто используйте "Публикация" вместо старого ключевого слова "Глобальное":

Public Module Module1
    Public Foo As Integer
End Module

Ответ 3

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

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

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

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


Ситуация; У вас есть несколько модулей и/или форм и вы хотите ссылаться на определенную переменную от всех или всех.

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

Public Module DefineGlobals

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

И затем в каждом модуле/форме, нуждающемся в адресации этой переменной "Части", поместите следующий код (в качестве примера формы "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 и, кажется, все это необходимо на данный момент (без каких-либо неизвестных файлов, загружаемых в фоновом режиме), хотя я не нашел конца "Oh btw..." неожиданные детали. И я уверен, что более предпочтительной будет стандартная стандартизация, но первая задача - просто получить что-то вообще, со стандартами или без них.

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

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

Ответ 4

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

Public Class Form1

   Public Shared SomeValue As Integer = 5

End Class

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

CarbageCollector

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

Форма IIS auth

и

IIS_session

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

Ответ 8

Ни один из этих ответов, кажется, ничего не меняет для меня.

Я конвертирую старую программу Excel в VB 2008. Конечно, есть много вещей, которые нужно изменить в Excel, но что-то, что вызывает головную боль, похоже, является этой "общедоступной" проблемой.

У меня есть около 40 массивов, на которые ссылаются около 20 модулей. Массивы составляют основу всего проекта и решаются практически каждой процедурой.

В Excel я просто должен был объявить их все как Public. Работал отлично. Нет проблем. Но в VB2008 я нахожу это довольно проблематичным. Абсурдно думать, что мне нужно пройти тысячи строк кода, чтобы просто указать каждой ссылке, где была объявлена публика. Но даже желая сделать это, ни одна из предлагаемых схем, кажется, не помогает вообще.

Похоже, что "Public" просто означает "Public в этом одном модуле". Добавление "Shared", похоже, ничего не меняет. Добавление имени модуля или чего-либо еще, похоже, не меняет этого. Каждый модуль настаивает на том, чтобы я объявлял все массивы (и около 100 других фундаментальных переменных) в каждом модуле (казалось бы, задом наперед). И бит "Импорт", кажется, тоже не знает, о чем я говорю, "не может быть найден".

Я должен сочувствовать спрашивающему. Что-то кажется ужасно неправильным со всем этим.

Ответ 9

Первый парень с публичным классом имеет гораздо больше смысла. У оригинального парня есть несколько форм, и если нужны глобальные переменные, тогда глобальный класс будет лучше. Подумайте о том, что кто-то программирует за ним, и ему нужно использовать глобальную переменную в классе, который у вас есть IntelliSense, это также значительно облегчит кодирование модификации через 6 месяцев.

Кроме того, если у меня есть мозги пердеть и использовать, как в примере части на уровне модуля, то я хочу, чтобы мои общие части я мог сделать что-то вроде

Dim Parts as Integer
parts = 3
GlobalVariables.parts += Parts  '< Not recommended but it works

По крайней мере, поэтому я бы пошел по классу.

Ответ 10

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

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

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

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

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

Ответ 11

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

Public Class Form1 
Friend sharevalue as string = "Boo"

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

Ответ 12

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

My.Settings.(Name of variable)

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

Ответ 13

Public Class Form1

   Public Shared SomeValue As Integer = 5

End Class

Ответ:

MessageBox.Show("this is the number"&GlobalVariables.SomeValue)