web-dev-qa-db-fra.com

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 tous les formulaires Visual Basic. Je sais comment déclarer une variable publique pour un formulaire spécifique, mais comment puis-je le faire pour tous les formulaires de mon projet?

35
Tal

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

Ce que vous pouvez faire (comme le suggèrent certaines des réponses) est de déclarer tout ce que vous voulez traiter en tant que variable globale sous forme de variables statiques à la place d'une classe particulière:

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

Toutefois, vous devrez qualifier toutes les références à ces variables où que vous souhaitiez les utiliser dans votre code. En ce sens, elles ne sont pas du type de variables globales avec lesquelles vous êtes peut-être familiers d'autres langages, car elles sont toujours associées à une classe particulière.

Par exemple, si vous souhaitez afficher une boîte de message dans le code de votre formulaire avec le nom de l'utilisateur, vous devrez procéder de la manière suivante:

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 laquelle elle est définie; vous devez également spécifier le nom de la classe dans laquelle elle est définie.


Si la pratique consistant à qualifier complètement vos variables vous effraie ou vous bouleverse pour une raison quelconque, vous pouvez toujours importer la classe contenant vos déclarations de variable globales (ici, GlobalVariables) en haut de chaque fichier de code (ou même du projet niveau, 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 identique à ce que le compilateur fait pour vous en coulisse lorsque vous déclarez vos variables globales dans un Module, plutôt que un Class. Dans VB.NET, qui propose des modules à des fins de compatibilité ascendante avec les versions précédentes de VB, un Module est simplement une classe statique scellée (ou, en termes VB.NET, Shared NotInheritable Class). Le IDE vous permet d’appeler des membres de modules sans les qualifier complètement ni en importer une référence. Même si vous décidez d'emprunter cette voie, il est important 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 font exactement vos outils, même si vous décidez de les utiliser. Et pour ce que cela vaut, je ne le recommande pas comme "meilleure pratique", car j'estime que cela tend à l'obscurité et au code/design propre orienté objet. Il est beaucoup plus probable qu'un programmeur C # comprenne votre code s'il est écrit comme ci-dessus plutôt que si vous l'enfonciez dans un module et laissiez le compilateur gérer tout. 


Notez que, comme au moins une autre réponse a été évoquée, 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 car elles sont également des objets. Chaque fois que vous ressentez le besoin d'utiliser des variables globales dans un langage orienté objet, c'est un signe que vous devez repenser votre conception. Si vous ne faites que passer à la programmation orientée objet, vous aurez tout intérêt à vous arrêter et à en apprendre quelques-uns des modèles de base avant de vous enraciner davantage dans l'écriture de code.

67
Cody Gray

De la même manière que vous avez toujours eu, avec "Modules" au lieu de classes et utilisez simplement "Public" au lieu de l'ancien mot clé "Global":

Public Module Module1
    Public Foo As Integer
End Module
21
RBarryYoung

D'accord. J'ai _ {enfin} _ trouvé ce qui fonctionne réellement pour répondre à la question qui semble être posée;

"Lorsque j'ai besoin de plusieurs modules et formulaires, comment puis-je déclarer une variable publique pour tous, de sorte qu'ils référencent chacun la même variable?"

Étonnamment pour moi, j'ai passé beaucoup de temps à chercher sur le Web cette question apparemment simple, ne trouvant que le vague qui me laissait encore des erreurs.

Mais grâce au lien de Cody Gray vers unexemple, j'ai pu discerner une réponse appropriée;


Situation ; Vous avez plusieurs modules et/ou formulaires et souhaitez référencer une variable particulière parmi chacun d’entre eux.

"Une" manière qui fonctionne; Sur un module, placez le code suivant (dans lequel "DefineGlobals" est un nom choisi arbitrairement); 

Public Module DefineGlobals

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

Ensuite, dans chaque module/formulaire nécessitant l’adressage de la variable "Parties", placez le code suivant (à titre d’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; Classe publique FormX

Sub CreateAff()

   Parts = 1000

End Sub 

 End Class

Ce type de codage semble avoir fonctionné sur mon VB2008 Express et semble être tout à fait nécessaire pour le moment (sans aucun fichier inconnu chargé en arrière-plan), même si je n’ai trouvé aucune fin à la surprise «Oh btw ...» détails. Et je suis convaincu qu'un degré de standardisation plus élevé serait préféré, mais la première tâche consiste simplement à faire fonctionner quelque chose, avec ou sans normes.

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

Merci encore, Cody

5
JSS

Rendez-le statique (partagé en VB).

Public Class Form1

   Public Shared SomeValue As Integer = 5

End Class
3
Jürgen Steinblock

Les variables publiques ont une odeur de code - essayez de modifier votre application de sorte qu'elles soient non nécessaires. La plupart des raisonnements ici et ici sont applicables à VB.NET.

Le moyen le plus simple d'avoir des variables globales dans VB.NET consiste à créer des variables statiques publiques sur une classe (déclarez une variable en tant que Public Shared).

2
Oded

Une variable globale peut être accessible dans tous vos formulaires de votre projet si vous utilisez le mot clé public shared s'il se trouve dans une classe. Cela fonctionnera également si vous utilisez le mot clé "public" s'il fait partie d'un module, mais ce n'est pas la meilleure pratique pour de nombreuses raisons.

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

L'un des problèmes est que 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 coup d'œil à l'article Variables globales dans Visual Basic .NET et téléchargez l'exemple de projet! 

1
Check-Kay Wong

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 du module est vu par tout le monde dans l'application, lisez le site Web. Non seulement dans ma session . Si j'essaie d'ajouter un calcul dans ma session, je dois créer un tableau pour filtrer les nombres pour ma session et pour les autres . Les modules sont un excellent moyen de travailler mais nécessitent de la concentration sur la façon de l'utiliser.

Pour aider contre les erreurs: les cours sont envoyés au

CarbageCollector

quand la page est finie. Mes modules restent en vie (tant que l'application n'est pas terminée ni redémarrée) et que je peux réutiliser les données qu'il contient . Je l'utilise pour enregistrer des données qui sont parfois perdues à cause du traitement de session par IIS.

Autorisation de formulaire IIS

et

IIS_session

ne sont pas synchronisés, et avec mon module, je récupère les données qui ont été dépassées.

1
Smart Thinker

Le premier gars avec une classe publique est beaucoup plus logique. Le type original a plusieurs formes et si des variables globales sont nécessaires, la classe globale sera meilleure. Pensez à quelqu'un qui code derrière lui et qui doit utiliser une variable globale dans une classe où vous avez intellisense. Cela facilitera également beaucoup le codage d'une modification 6 mois plus tard.

De plus, si j'ai un fou de cerveau et que j'utilise comme dans un exemple de partie au niveau du module, alors je veux mes parties globales, je peux faire quelque chose comme:

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

Au moins c'est pourquoi je choisirais la voie de la classe.

0
user3235466

Vous pouvez simplement ajouter une nouvelle variable sous les propriétés de votre projet Chaque fois que vous voulez obtenir cette variable, vous devez simplement utiliser

My.Settings.(Name of variable)

Cela fonctionnera pour l'ensemble du projet sous toutes ses formes

0
2zoo

Tout ce qui précède peut être évité en déclarant simplement une valeur d'ami pour l'exécution sur le formulaire de départ.

Public Class Form1 
Friend sharevalue as string = "Boo"

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

0
user2366092

Les différentes réponses de ce blog semblent être définies par les SE qui encouragent le strict respect des règles habituelles de la programmation orientée objet (utiliser une classe publique avec des références publiques partagées (ou statiques) et entièrement qualifiées, ou des SE encourageant l'utilisation la fonctionnalité de compatibilité ascendante (Module) pour laquelle le compilateur doit évidemment faire la même chose pour que cela fonctionne.

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

  1. Si vous écrivez tout le nouveau code (sans tenter de convertir une application héritée), évitez d'utiliser ces formulaires, sauf dans les rares cas où vous avez VRAIMENT besoin d'une variable statique, car elles peuvent avoir des conséquences terribles (et trouver des bugs). (Le code multithread et multitraitement nécessite des sémaphores autour des variables statiques ...)

  2. Si vous modifiez une petite application qui contient déjà quelques variables globales, formulez-les afin qu'elles ne soient pas masquées par les modules, c'est-à-dire utilisez les règles standard de la programmation orientée objet pour les recréer en tant que public statique et y accéder en mode plein. qualification afin que les 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, utilisez Modules pour les définir. Il n'y a aucune raison de perdre du temps à faire fonctionner l'application, car vous êtes probablement déjà derrière le 8-ball en temps passé sur Propriétés, etc.

0
Jon Campbell

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 de choses à modifier dans Excel, mais quelque chose qui cause un mal de tête semble être tout ce problème "public".

J'ai environ 40 tableaux 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 comme publics. A bien fonctionné. Aucun problème. Mais dans VB2008, je trouve cela assez problématique. Il est absurde de penser que je dois parcourir des milliers de lignes de code simplement pour indiquer à chaque référence où le public a été déclaré. Mais même disposés à le faire, aucun des systèmes proposés ne semble aider du tout.

Il semble que "public" signifie simplement "public dans ce module". Ajouter "Partagé" ne semble rien changer à cela. Ajouter le nom du module ou quoi que ce soit d'autre ne semble pas changer cela. Chaque module insiste pour que je déclare tous les tableaux (et environ 100 autres variables fondamentales) dans chaque module (une avance apparemment en arrière). Et le volet "Importations" ne semble pas savoir de quoi je parle, "est introuvable".

Je dois sympathiser avec le questionneur. Quelque chose semble terriblement mal avec tout cela.

0
JSS