temp3 = [item for item in temp1 if item not in temp2]
Невозможно объявить глобальные переменные, поскольку вы, вероятно, воображаете их в 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 - полностью объектно-ориентированный язык. Это означает, среди прочего, что все является объектом. Даже «глобальные» переменные должны быть определены в экземпляре класса, потому что они также являются объектами. Каждый раз, когда вы чувствуете необходимость использовать глобальные переменные в объектно-ориентированном языке, этот знак вам нужно переосмыслить ваш дизайн. Если вы просто переходите к объектно-ориентированному программированию, вам стоит больше времени останавливаться и изучать некоторые основные шаблоны, прежде чем приступить к написанию кода.
Публичные переменные - это запах кода - попробуйте перепроектировать ваше приложение, чтобы это были , а не . Большинство аргументов здесь и здесь применимы к VB.NET.
Самый простой способ иметь глобальные переменные в VB.NET - создать публичные статические переменные в классе (объявить переменную как Public Shared
).
Public Class Form1
Public Shared SomeValue As Integer = 5
End Class
Ответ:
MessageBox.Show("this is the number"&GlobalVariables.SomeValue)
Ни один из этих ответов не меняет ничего для меня.
Я конвертирую старую программу Excel в VB 2008. Конечно, есть много изменений в Excel, но что-то, что вызывает
У меня около 40 массивов, на которые ссылаются примерно 20 модулей. Массивы составляют основу всего проекта и рассматриваются практически по каждой процедуре.
В Excel я просто должен был объявить их как Public. Отлично. Нет проблем. Но в VB2008 я нахожу это довольно проблемой. Абсурдно думать, что мне нужно пройти через тысячи строк кода, чтобы указать каждую ссылку, в которой объявлен Public. Но, даже желая этого, ни одна из предложенных схем не помогает вообще.
Похоже, что «Общественность» просто означает «Публикация в этом одном модуле». Добавление «Shared», похоже, ничего не меняет, чтобы изменить это. Добавление имени модуля или чего-либо еще, похоже, не меняет этого. Каждый модуль настаивает на том, что я объявляю все массивы (и около 100 других фундаментальных переменных) в каждом модуле (по-видимому, назад). И бит «Импорт», похоже, не знает, о чем я говорю, «не может быть найден».
Я должен сочувствовать этому вопросу. Что-то кажется ужасно несовместимым со всем этим.
Первый парень с публичным классом дает больше смысла. Оригинальный парень имеет несколько форм, и если нужны глобальные переменные, то глобальный класс будет лучше. Подумайте о ком-то кодировании позади него, и вам нужно использовать глобальную переменную в классе, который у вас есть intellisense, и он будет делать модификацию через 6 месяцев намного легче.
Также, если у меня есть мозговой пердит и использование как в примерах частей на уровне модуля, тогда я хочу, чтобы мои глобальные части могли делать что-то вроде
Dim Parts as Integer
parts = 3
GlobalVariables.parts += Parts '< Not recommended but it works
По крайней мере, поэтому я пошел бы по маршруту класса.
Различные ответы в этом блоге, по-видимому, определяются SE, которые способствуют строгому соблюдению обычных правил объектно-ориентированного программирования (используйте открытый класс с общедоступными общедоступными (aka static) и полностью квалифицированными ссылками на классы, или SE которые продвигают использование функции обратной совместимости (Module), для которой компилятор, очевидно, должен сделать то же самое, чтобы заставить его работать.
Будучи SE с опытом более 30 лет, я бы предложил следующие рекомендации:
Хорошо. Я наконец нашел, что на самом деле работает, чтобы ответить на вопрос, который, как представляется, задан,
«Когда вам нужно много модулей и форм, как я могу объявить переменную общедоступной для всех они, такие, что каждый из них ссылается на одну и ту же переменную? »
Удивительно для меня, я потратил немало времени на поиск в Интернете по этому, казалось бы, простому вопросу, не обнаружив ничего, кроме неопределенности, которая оставила меня все еще с ошибками.
Но благодаря ссылке Коди Грея на пример , я смог определить правильный ответ:
Ситуация; У вас есть несколько модулей и / или форм и вы хотите ссылаться на определенную переменную от каждого или всех.
«A», который работает; На одном модуле разместите следующий код (где «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
И, возможно, другая форма; Public Class FormX
Sub CreateAff()
Parts = 1000
End Sub
End Class
Этот тип кодирования, похоже, работал на моем VB2008 Express и, кажется, все это необходимо на данный момент (без каких-либо неизвестных файлов, загружаемых в фоновом режиме), хотя у меня есть не нашел конца «О кстати ...» сюрприз детали. И я уверен, что более предпочтительной будет стандартизация, но первая задача - просто получить что-то вообще, с или без стандартов.
Ничто не сравнится с точными и хорошо сформулированными явными примерами.
Еще раз спасибо, Коди
Глобальная переменная может быть доступна во всех ваших формах в вашем проекте, если вы используете ключевое слово public shared
, если оно находится в классе. Он также будет работать, если вы используете ключевое слово «public», если оно находится под модулем, но это не лучшая практика по многим причинам.
(... Да, я несколько повторяю, что «Cody Gray »и« RBarryYoung »сказал.)
Одна из проблем заключается в том, что у вас есть два потока, которые одновременно называют одну и ту же глобальную переменную. У вас будут некоторые сюрпризы. У вас могут быть неожиданные реакции, если вы не знаете их ограничений. Взгляните на Глобальные переменные в Visual Basic .NET и загрузите образец проекта!
Практически так же, как и у вас, с «Модулями» вместо классов и просто используйте «Публикация» вместо старого ключевого слова «Глобальное»:
Public Module Module1
Public Foo As Integer
End Module
небольшое примечание: я использую модули в веб-приложении (asp.net). Мне нужно помнить, что все, что я храню в переменных на модуле, видят все в приложении, читают веб-сайт. Не только в моей сессии. Если я попытаюсь добавить вычисление в свой сеанс, мне нужно сделать массив для фильтрации чисел для моей сессии и для других. Модули - отличный способ работать, но нужно сосредоточиться на том, как его использовать.
Чтобы помочь в ошибках: классы отправляются на
CarbageCollector
blockquote>, когда страница будет завершена. Мои модули остаются в живых (пока приложение не закончилось или не перезапущено), и я могу повторно использовать данные в нем. Я использую это для сохранения данных, которые иногда теряются из-за обработки сеанса IIS.
Форма IIS auth
blockquote>и
IIS_session
blockquote>не синхронизированы, и с моим модулем я вывожу данные, которые перешли через утес.
Сделать его статическим (совместно используемым в VB).
Public Class Form1
Public Shared SomeValue As Integer = 5
End Class
Все вышеизложенное можно избежать, просто объявив значение друга для времени выполнения в стартовой форме.
Public Class Form1
Friend sharevalue as string = "Boo"
Затем доступ к этой переменной из всех форм с помощью Form1.sharevalue
My.Settings.FullName
? Похоже, что глобальное хранилище доступно из любого места приложения. – wpcoder 28 July 2017 в 20:30