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

olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 3 mars 2008 à 21:39 - Dernière réponse : olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention
- 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;
....
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 3 mars 2008 à 23:09
3
Merci
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;
};

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de Lutinore
Meilleure réponse
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 4 mars 2008 à 09:12
3
Merci
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]

Merci sebmafate 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de sebmafate
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 3 mars 2008 à 23:20
0
Merci
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 ?
Commenter la réponse de olibara
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 3 mars 2008 à 23:42
0
Merci
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.
Commenter la réponse de Lutinore
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 3 mars 2008 à 23:59
0
Merci
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
Commenter la réponse de olibara
olibara 670 Messages postés dimanche 16 décembre 2007Date d'inscription 11 mars 2010 Dernière intervention - 4 mars 2008 à 09:40
0
Merci
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 ..
Commenter la réponse de olibara

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.