Declarar variables globales en Visual Studio 2010 y VB.NET

¿Cómo declaro una variable global en Visual Basic?

Estas variables deben ser accesibles desde todos los formularios de Visual Basic. Sé cómo declarar una variable pública para un formulario específico, pero ¿cómo hago esto para todos los formularios en mi proyecto?

No hay forma de declarar variables globales ya que probablemente las esté imaginando en VB.NET.

Lo que puede hacer (como han sugerido algunas de las otras respuestas) es declarar todo lo que desea tratar como una variable global como variables estáticas en lugar de una clase en particular:

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

Sin embargo, deberá calificar completamente todas las referencias a esas variables en cualquier lugar que desee usarlas en su código. En este sentido, no son el tipo de variables globales con las que puede estar familiarizado con otros idiomas, porque todavía están asociadas con alguna clase en particular.

Por ejemplo, si desea mostrar un cuadro de mensaje en el código de su formulario con el nombre del usuario, tendrá que hacer algo como esto:

 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 

No puede simplemente acceder a la variable escribiendo UserName fuera de la clase en la que está definida; también debe especificar el nombre de la clase en la que está definida.

Si la práctica de calificar completamente sus variables lo horroriza o molesta por cualquier razón, siempre puede importar la clase que contiene sus declaraciones de variables globales (aquí, GlobalVariables ) en la parte superior de cada archivo de código (o incluso a nivel de proyecto, en la ventana de Propiedades del proyecto). Entonces, simplemente podría hacer referencia a las variables por su nombre.

 Imports GlobalVariables 

Tenga en cuenta que esto es exactamente lo mismo que el comstackdor está haciendo detrás de las escenas cuando declara sus variables globales en un Module , en lugar de una Class . En VB.NET, que ofrece módulos para fines de compatibilidad con versiones anteriores de VB, un Module es simplemente una clase estática sellada (o, en términos de VB.NET, Shared NotInheritable Class ). El IDE le permite llamar a los miembros de los módulos sin calificarlos completamente o importarles una referencia. Incluso si decide seguir esta ruta, vale la pena comprender lo que sucede detrás de escena en un lenguaje orientado a objetos como VB.NET. Creo que, como progtwigdor, es importante entender qué está sucediendo y qué hacen exactamente sus herramientas por usted, incluso si decide usarlas. Y por lo que vale, no lo recomiendo como una “mejor práctica” porque creo que tiende a la oscuridad y al código / diseño limpio orientado a objetos. Es mucho más probable que un progtwigdor de C # comprenda su código si está escrito como se muestra arriba que si lo incluye en un módulo y deja que el comstackdor maneje todo.

Tenga en cuenta que, al igual que al menos otra respuesta aludida, VB.NET es un lenguaje totalmente orientado a objetos. Eso significa, entre otras cosas, que todo es un objeto. Incluso las variables “globales” deben definirse dentro de una instancia de una clase porque también son objetos. Cada vez que sienta la necesidad de usar variables globales en un lenguaje orientado a objetos, ese es un signo de que necesita replantearse su diseño. Si solo está haciendo el cambio a la progtwigción orientada a objetos, es más que vale la pena detenerse y aprender algunos de los patrones básicos antes de atrincherarse más en la escritura de código.

Casi de la misma manera que siempre lo ha hecho, con “Módulos” en lugar de clases y simplemente use “Público” en lugar de la antigua palabra clave “Global”:

 Public Module Module1 Public Foo As Integer End Module 

Bueno. Finalmente encontré lo que realmente funciona para responder la pregunta que parece hacerse;

“Cuando necesito muchos módulos y formularios, ¿cómo puedo declarar que una variable es pública para todos ellos de manera que cada uno haga referencia a la misma variable?”

Sorprendentemente para mí, pasé un tiempo considerable buscando en la web esa pregunta aparentemente simple, sin encontrar nada más que vaguedad que me dejó aún recibiendo errores.

Pero gracias al enlace de Cody Gray a un ejemplo , pude discernir una respuesta adecuada;


Situación ; Tiene múltiples Módulos y / o Formularios y desea hacer referencia a una variable particular de cada uno o de todos.

“A” forma que funciona; En un módulo, coloque el siguiente código (en el que “DefineGlobals” es un nombre elegido arbitrariamente);

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

Y luego, en cada Módulo / Formulario que necesita abordar esa variable “Partes”, coloque el siguiente código (como un ejemplo del formulario “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 

Y quizás otra Forma; Public Class FormX

 Sub CreateAff() Parts = 1000 End Sub End Class 

Ese tipo de encoding parece haber funcionado en mi VB2008 Express y parece que todo se necesita en este momento (sin ningún archivo desconocido que se cargue en el fondo) aunque no he encontrado fin a la sorpresa “Oh btw …” detalles. Y estoy seguro de que se preferiría un mayor grado de estandarización, pero la primera tarea es simplemente hacer que funcione algo, con o sin estándares.

Nada supera ejemplos exactos y bien redactados, explícitos .

Gracias de nuevo, Cody

Hacerlo estático (compartido en VB).

 Public Class Form1 Public Shared SomeValue As Integer = 5 End Class 

Las variables públicas son un olor a código: intente rediseñar su aplicación para que no sean necesarias. La mayoría de los razonamientos aquí y aquí son aplicables a VB.NET.

La forma más sencilla de tener variables globales en VB.NET es crear variables públicas estáticas en una clase (declarar una variable como Public Shared ).

Una variable global podría ser accesible en todos sus formularios en su proyecto si usa la palabra clave public shared si está en una clase. También funcionará si usa la palabra clave “público” si está bajo un Módulo, pero no es la mejor práctica por muchas razones.

(… Sí, de alguna forma repito lo que dijeron “Cody Gray” y “RBarryYoung”).

Uno de los problemas es cuando tienes dos hilos que llaman a la misma variable global al mismo tiempo. Tendrás algunas sorpresas. Es posible que tenga reacciones inesperadas si no conoce sus limitaciones. Eche un vistazo a la publicación Variables globales en Visual Basic .NET y descargue el proyecto de muestra.

observación pequeña: estoy usando módulos en aplicaciones basadas en web (asp.net). Necesito recordar que todo lo que almaceno en las variables en el módulo es visto por todos en la aplicación, lea el sitio web. No solo en mi sesión Si bash agregar un cálculo en mi sesión, necesito hacer una matriz para filtrar los números de mi sesión y de otros. Los módulos son una excelente manera de trabajar, pero necesitan concentración en cómo usarlos.

Para ayudar contra los errores: las clases se envían a la

CarbageCollector

cuando la página está terminada Mis módulos permanecen vivos (siempre que la aplicación no finalice o no se reinicie) y puedo reutilizar los datos en él. Lo uso para guardar datos que a veces se pierden debido a la administración de la sesión de IIS.

IIS Form auth

y

IIS_session

no están sincronizados, y con mi módulo retrotrajo datos que pasaron por el precipicio.

Ninguna de estas respuestas parece estar cambiando nada para mí.

Estoy convirtiendo un antiguo progtwig de Excel en VB 2008. Por supuesto, hay muchas cosas específicas de Excel que cambiar, pero algo que está causando dolor de cabeza parece ser todo este asunto “Público”.

Tengo unos 40 arreglos a los que hacen referencia aproximadamente 20 módulos. Las matrices forman la base de todo el proyecto y se abordan en casi todos los procedimientos.

En Excel, simplemente tuve que declararlos todos como públicos. Funcionó muy bien. No hay problema. Pero en VB2008, estoy encontrando todo un problema. Es absurdo pensar que tengo que pasar por miles de líneas de código simplemente para decir cada referencia donde se ha declarado el público. Pero incluso dispuestos a hacerlo, ninguno de los esquemas propuestos parece ayudar en absoluto.

Parece que “Público” simplemente significa “Público dentro de este módulo”. Agregar “Compartido” parece no hacer nada para cambiar eso. Agregar el nombre del módulo o cualquier otra cosa no parece cambiar eso. Cada módulo insiste en que declare todas las matrices (y alrededor de otras 100 variables fundamentales) dentro de cada módulo (un avance aparentemente atrasado). Y el bit “Importaciones” tampoco parece saber a qué me refiero, “no se puede encontrar”.

Tengo que simpatizar con el que pregunta. Algo parece terriblemente mal con todo esto.

El primer tipo con una clase pública tiene mucho más sentido. El chico original tiene múltiples formas y si se necesitan variables globales, la clase global será mejor. Piense en alguien que codifica detrás de él y necesita usar una variable global en una clase que tenga intellisense, también hará que la encoding una modificación 6 meses después sea mucho más fácil.

Además, si tengo un pedo cerebral y lo uso en un ejemplo de partes en un nivel de módulo, entonces quiero mis partes globales, puedo hacer algo como

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

Al menos es por eso que iría a la ruta de clase.

Las diversas respuestas en este blog parecen definidas por SE que promueven el estricto cumplimiento de las reglas habituales de progtwigción orientada a objetos (use una clase pública con referencias públicas compartidas (también estáticas) y de clase completa, o SE que promueven el uso la característica de compatibilidad con versiones anteriores (Módulo) para la que obviamente el comstackdor necesita hacer lo mismo para que funcione.

Como SE con más de 30 años de experiencia, propondría las siguientes pautas:

  1. Si está escribiendo todo el código nuevo (sin intentar convertir una aplicación heredada), evitará utilizar estos formularios por completo, excepto en el caso excepcional de que realmente necesite tener una variable estática, ya que pueden causar terribles consecuencias (y realmente difíciles). para encontrar errores). (El código multiproceso y multiproceso requiere semáforos alrededor de variables estáticas …)

  2. Si está modificando una aplicación pequeña que ya tiene algunas variables globales, formúlelas para que no queden oscurecidas por los Módulos, es decir, utilice las reglas estándar de progtwigción orientada a objetos para recrearlas como estáticas públicas y acceder a ellas por completo. calificación para que otros puedan descubrir qué está pasando.

  3. Si tiene una gran aplicación heredada con docenas o cientos de variables globales, use todos los Módulos para definirlas. No hay ninguna razón para perder el tiempo al hacer que la aplicación funcione, porque probablemente ya esté detrás de la bola 8 en el tiempo invertido en Propiedades, etc.

Todo lo anterior se puede evitar simplemente declarando un valor de amigo para el tiempo de ejecución en el formulario de inicio.

 Public Class Form1 Friend sharevalue as string = "Boo" 

Luego acceda a esta variable desde todas las formas simplemente usando Form1.sharevalue

 Public Class Form1 Public Shared SomeValue As Integer = 5 End Class 

La respuesta:

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