Visibilité des variables Public Static : toujours pas compris

Résolu
olibara
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
- 3 mars 2008 à 21:39
olibara
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
- 4 mars 2008 à 09:40
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

Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
3 mars 2008 à 23:09
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;
};
3
sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
4 mars 2008 à 09:12
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]
3
olibara
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
3 mars 2008 à 23:20
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 ?
0
Lutinore
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Membre
Dernière intervention
27 octobre 2012
42
3 mars 2008 à 23:42
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
olibara
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
3 mars 2008 à 23:59
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
0
olibara
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
4 mars 2008 à 09:40
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 ..
0