Visibilité des variables Public Static : toujours pas compris [Résolu]

Signaler
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
-
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
-
Bonsoir

Je n'ai hélas toujours pa bien compris le mecanisme de visibilité des variables en C# (pourtant en c je n'ai pas de problème avec ca)

Dans la classe d'une form (MainForm) je declare qq variables
Jez voudrais acceder a ces variables depuis une autre form MainForm.maVariable

Mais je constate que pour certaines il suffit de les declarer public, pour d'autres il faut les déclarer static et public ???
Quelle est la regle et / ou la bonne maniere de faire

Dans l'exemple ci apres seuls PntF et dsAddr sont visibles depuis l'autre form
dsAddr doit etre static
PntF peu etre public !

Mais je crois que j'ai compris en partie : PntF est considéré comme type et DOIT etre instancié donc pas de problème pour en parler au voisin
Tandis que dsAddr a été instancié dans MainForm donc on ne pourra le voir que s'il a été boulonné static 

Me trompe je ?

Mais cela veut il dire que toute variable partagée par deux form dans une troisieme classe commune doit aussi etre déclarée static ?

Ne fais-je pas une grosse erreur conceptuelle 

  public partial class MainForm : Form
  {
    MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection();
    static public DataSet dsAddr = new DataSet();
    public struct PntF
    {
      public double X;
      public double Y;
    };


    public int initD = 0;
....

6 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Salut,

Le mot clé "static" modifie la durée de vie d'une variable, une variable statique existe même sans aucune instance de son type. ( Il est possible de déclarer une classe statique mais ça n'a pas la même signification ).

// dsAddr est une variable, de la mémoire est allouée.

static public DataSet dsAddr = new DataSet();

// PntF est un type, rien n'est encore alloué.

public struct PntF
{
  public double X;
  public double Y;
};
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
33
je voudrais préciser un truc...

le mot clé static modifie comme l'a dit lutinore la durée de vie d'une variable... mais surtout attache cette variable à la classe plutot qu'à l'instance.

En gros, sans le mot clé static il faut que tu instancies ta classe pour accéder à ta variable... mais avec, il te suffit de faire [class].[variable].

Attention toutefois, ça pose aussi des problèmes car il est impossible d'utiliser le mot clé this dans une méthode static.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
4
Merci Lutinore

Oui bien c'est ce que je commence a comprendre

Mais je suis pas encore satisfait pour ce que je veux faire

Je commence a comprendre que si je veux utiliser des elements d'une form dans une autre, la maniere la plus elégante c'est de rassembler ces elements dans une classe que je passerai au constructeur de ma Form tandis que la methode de declaration statique public est peut etre plus rapide mais plus bricolée.

Me trompe je ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Oui c'est ça, contrairement au C, les variables globales n'existent pas, elles doivent être déclarées dans une classe. Une classe statique peut simuler une portée globale.
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
4
Merci

De toute façon meme en C je n'ai jamais aimé les variables globales, mais parcimonieusement c'est parfois tres pratique si on veut eviter de passer des parametres en cascade en chipotant dans tous le code

La maniere dont j'evitais ca en C est de declarer une structure container commune Prm que je prends soin passer depuis le main a chaque fonction. En pratique c'est tres souple, simple a maintenir et tres agreable a exploiter
Par contre en C# je tatonne encore pour rendre certains parametres facilement accessible sans devoir faire trop de gymnatique
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
4
Yess

Merci j'avais effectivement constaté est c'est evidement normal.
En fait on définit un objet commun contenants les truc qu'on aimerait avoir toujours sous la main !
Avec prudence et pacimonie ca peut etre tres pratique et faciliter certaines choses ..