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;
....
A voir également:

6 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
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 37
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 6
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 41
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 6
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 6
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
Rejoignez-nous