Déclarer des variables globales dans Visual Studio 2010 et VB.NET

Comment déclarer une variable globale dans Visual Basic?

ces variables doivent être accessibles à partir de toutes les formes visuelles de base. Je sais comment déclarer une variable publique pour un formulaire spécifique, mais comment le faire pour tous les formulaires de mon projet?

33
demandé sur Peter Mortensen 2010-12-25 12:20:33

12 réponses

il n'y a aucun moyen de déclarer les variables globales car vous les imaginez probablement dans VB.NET.

Ce que vous peut faire (comme certains des autres réponses ont suggéré) est déclarer tout ce que vous voulez traiter comme une variable globale comme variables statiques plutôt au sein d'une classe:

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

cependant, vous aurez besoin de pleinement qualifier toutes les références à ces variables n'importe où vous voulez les utiliser dans votre code. En ce sens, ils ne sont pas le type de variables globales avec lesquelles vous pouvez être familier avec d'autres langues, parce qu'ils sont toujours associés à une classe particulière.

par exemple, si vous voulez afficher une boîte de message dans le code de votre formulaire avec le nom de l'utilisateur, vous devrez faire quelque chose comme ceci:

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

vous ne pouvez pas simplement accéder à la variable en tapant UserName en dehors de la classe dans qui il est défini, vous devez également spécifier le nom de la classe dans laquelle elle est définie.



Si la pratique de qualifier entièrement vos variables vous horrifie ou vous dérange pour une raison quelconque, vous pouvez toujours importer la classe qui contient vos déclarations de variables globales (ici, GlobalVariables ) en haut de chaque fichier de code (ou même au niveau du projet, dans la fenêtre Propriétés du projet). Ensuite, vous pouvez simplement référencer les variables par leur nom.

Imports GlobalVariables

Notez que c'est exactement la même chose que le compilateur fait pour vous dans les coulisses lorsque vous déclarez vos variables globales dans un Module , plutôt qu'un Class . En VB.NET, qui offre des modules de rétrocompatibilité avec les versions précédentes de VB, une Module est simplement une classe statique scellée (ou, en VB.NET Termes, Shared NotInheritable Class ). L'IDE vous permet d'appeler des membres à partir de modules sans qualifier entièrement ou importer une référence à eux. Même si vous décidez de suivre cette voie, il vaut la peine de comprendre ce qui se passe dans les coulisses dans un langage orienté objet comme VB.NET. Je pense qu'en tant que programmeur, il est important de comprendre ce qui se passe et ce que vos outils font exactement pour vous, même si vous décidez de les utiliser. Et pour ce que ça vaut, Je ne le recommande pas comme une "meilleure pratique" parce que j'ai l'impression qu'elle tend vers l'obscurité et la propreté orientée objet code/design. Il est beaucoup plus probable qu'un programmeur C# comprendra votre code s'il est écrit comme indiqué ci-dessus que si vous le mettez dans un module et laissez le compilateur s'occuper de tout.



Notez que comme au moins une autre réponse a fait allusion, VB.NET est un langage entièrement orienté objet. Cela signifie, entre autres choses, que tout est un objet. Même les variables "globales" doivent être définies dans une instance d'une classe, parce qu'ils sont des objets. Tout moment vous vous sentez le besoin d'utiliser des variables globales dans un langage orienté-objet, qu'un signe que vous devez repenser votre conception. Si vous êtes juste en train de faire le passage à la programmation orientée objet, il est plus que la peine de votre temps pour s'arrêter et apprendre certains des modèles de base avant de vous enchâsser dans le code d'écriture.

63
répondu Cody Gray 2016-02-27 11:27:00

à peu près de la même façon que vous avez toujours, avec "Modules" au lieu de classes et juste utiliser "Public" au lieu de l'ancien" Global "mot-clé:

Public Module Module1
    Public Foo As Integer
End Module
20
répondu RBarryYoung 2010-12-25 11:09:33

OK. I enfin trouvé ce qui fonctionne réellement pour répondre à la question qui semble être posée;

" quand j'ai besoin de beaucoup de modules et de formulaires, Comment puis-je déclarer qu'une variable est publique à chacun d'eux de sorte qu'ils se réfèrent chacun à la même variable?"

étonnamment, j'ai passé beaucoup de temps à chercher sur le web cette question apparemment simple, ne trouvant rien d'autre que le flou qui me laissait encore des erreurs.

mais grâce au lien de Cody Gray vers un exemple , j'ai pu discerner une réponse correcte;


Situation ; Vous avez plusieurs Modules et / ou Formulaires et vous voulez faire référence à une variable particulière de chacun ou de tous.

"Une voie" qui fonctionne; Sur un module placer le code suivant (dans lequel "DefineGlobals" est un arbitrairement choisi nom);

Public Module DefineGlobals

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

et ensuite, dans chaque Module/formulaire devant traiter cette variable "Parts", placer le code suivant (comme exemple du formulaire "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

et peut-être une autre forme; Public Class FormX

Sub CreateAff()

   Parts = 1000

End Sub 

 End Class

ce type de codage semble avoir fonctionné sur mon Vb2008 Express et semble être tout nécessaire pour le moment (sans que des fichiers inconnus soient chargés en arrière-plan) même si je n'ont pas trouvé de fin à la " oh btw..."la surprise de détails. Et je suis certain qu'un plus grand degré de standardisation serait préférable, mais la première tâche est simplement de faire fonctionner quelque chose, avec ou sans normes.

Rien ne vaut les exact et bien rédigé, explicite exemples.

Merci encore, Cody

5
répondu JSS 2015-12-17 20:11:58

le rendre statique (partagé en VB).

Public Class Form1

   Public Shared SomeValue As Integer = 5

End Class
3
répondu Jürgen Steinblock 2010-12-25 10:07:56

variables Publiques sont une odeur de code - essayer de revoir la conception de votre application, de sorte que ces sont des pas nécessaire. La plus grande partie du raisonnement ici et ici s'applique VB.NET.

la façon la plus simple d'avoir des variables globales en VB.NET est de créer des variables statiques publiques sur une classe (déclarer une variable comme Public Shared ).

2
répondu Oded 2017-05-23 10:29:37

une variable globale pourrait être accessible dans toutes vos formes dans votre projet si vous utilisez le mot-clé public shared si elle est dans une classe. Il fonctionnera également si vous utilisez le mot-clé "public" si elle est sous un Module, mais il n'est pas la meilleure pratique pour de nombreuses raisons.

(... Oui, je répète un peu ce que "Cody Gray" et "RBarryYoung" ont dit.)

L'un des problèmes est quand vous avez deux threads qui appellent la même variable globale en même temps. Vous aurez des surprises. Vous pourriez avoir des réactions inattendues si vous ne connaissez pas leurs limites. Jetez un oeil à l'article global Variables in Visual Basic. net et téléchargez le projet échantillon!

1
répondu Check-Kay Wong 2013-09-26 14:16:29

petite remarque: j'utilise des modules dans une application Web (asp.net). Je dois me rappeler que tout ce que je stocke dans les variables sur le module sont vus par tout le monde dans l'application, lire le site web. Pas seulement dans ma session. Si j'essaie d'ajouter un calcul dans ma session, j'ai besoin de faire un tableau pour filtrer les chiffres de ma session et pour les autres. Modules est une excellente façon de travailler, mais il faut se concentrer sur la façon de l'utiliser.

pour aider contre les erreurs: les classes sont envoyer au

CarbageCollector

lorsque la page est terminée. Mes modules restent vivants (tant que l'application n'est pas terminée ou redémarrée) et je peux réutiliser les données qu'ils contiennent. Je l'utilise pour sauvegarder des données qui sont parfois perdues à cause de la manipulation de session par IIS.

IIS Form auth

et

session

ne sont pas synchronisés, et avec mon module je retire les données qui sont passées au-dessus de de cliff.

1
répondu Smart Thinker 2015-10-21 08:46:23

aucune de ces réponses ne semble changer quoi que ce soit pour moi.

je suis en train de convertir un ancien programme Excel en VB 2008. Bien sûr, il y a beaucoup D'excellentes choses spécifiques à changer, mais quelque chose qui cause un mal de tête semble être toute cette question "publique".

j'ai environ 40 tableaux tous référencés par environ 20 modules. Les tableaux constituent la base de l'ensemble du projet et sont traités par à peu près toutes les procédures.

dans Excel, je devais simplement les déclarer tous publics. A très bien fonctionné. Pas de problème. Mais en VB2008, je trouve que c'est tout un problème. Il est absurde de penser que je dois passer par des milliers de lignes de code simplement pour dire à chaque référence où le Public a été déclaré. Mais même prêt à le faire, aucun des systèmes proposés semble pour aider à tous.

Il semble que le "Public" signifie simplement "Public à l'intérieur de cette un module". Ajouter "partagé" semble ne rien faire pour changer cela. Ajouter le nom du module ou autre chose ne semble pas changer cela. Chaque module insiste pour que je déclare tous les tableaux (et environ 100 autres variables fondamentales) à l'intérieur de chaque module (une avance apparemment en arrière). Et le morceau" Imports "ne semble pas savoir de quoi je parle non plus,"introuvable".

je dois sympathiser avec l'auteur de la question. Quelque chose semble terriblement de mal avec tout ça.

0
répondu JSS 2013-05-11 12:55:57

le premier gars avec un cours public a beaucoup plus de sens. Le type original a plusieurs formes et si les variables globales sont nécessaires alors la classe globale sera meilleure. Pensez à quelqu'un codant derrière lui et a besoin d'utiliser une variable globale dans une classe que vous avez intellisense, il sera également rendre le codage une modification 6 mois plus tard beaucoup plus facile.

aussi si j'ai un cerveau qui pète et que j'utilise comme dans un exemple de pièces au niveau d'un module, alors je veux mes pièces globales que je peux faire quelque chose comme

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

du moins, c'est pour ça que j'irais en classe.

0
répondu user3235466 2014-01-25 15:56:05

les différentes réponses dans ce blog semblent être définies par SE's qui promeuvent le strict respect des règles habituelles de la programmation orientée objet (utiliser une classe publique avec public partagé (aka static), et des références de classe pleinement qualifiés, ou SE's qui promeuvent l'utilisation de la fonctionnalité rétrocompatibilité (Module) pour lequel le compilateur doit évidemment faire la même chose pour le faire fonctionner.

en tant que SE comptant plus de 30 ans d'expérience, je proposerais les lignes directrices suivantes::

  1. si vous écrivez tout nouveau code (ne pas essayer de convertir une application héritée) que vous évitez d'utiliser ces formes tout à fait sauf dans le cas rare que vous avez vraiment besoin d'avoir une variable statique, parce qu'ils peuvent causer des conséquences terribles (et vraiment difficile de trouver des bogues). (Multithread et le multitraitement code exige que les sémaphores autour de variables statiques...)

  2. Si vous modifiez un petit application qui a déjà quelques variables globales, puis les formuler pour qu'elles ne soient pas obscurcies par les Modules, c'est-à-dire, utiliser les règles standard de la programmation orientée objet pour les recréer comme statique publique et y accéder par qualification complète afin que d'autres puissent comprendre ce qui se passe.

  3. si vous avez une énorme application héritée avec des dizaines ou des centaines de variables globales, par tous les moyens utiliser des Modules pour les définir. Il n'y a pas de raison de perdre du temps lorsque l'application fonctionne, parce que vous êtes probablement déjà derrière la 8-boule dans le temps passé sur les propriétés, etc.

0
répondu Jon Campbell 2014-12-09 17:32:10

tout ce qui précède peut être évité en déclarant simplement une valeur ami pour runtime sur la forme de départ.

Public Class Form1 
Friend sharevalue as string = "Boo"

puis accédez à cette variable à partir de tous les formulaires en utilisant simplement Form1.sharevalue

0
répondu user2366092 2016-03-20 10:56:45
Public Class Form1

   Public Shared SomeValue As Integer = 5

End Class

la réponse:

MessageBox.Show("this is the number"&GlobalVariables.SomeValue)
-4
répondu chami 2012-10-02 07:49:02