[C#] variable globale et portée

Signaler
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour,
j'ai un problème de portée de mes variables, je m'explique;
j'ai un programme qui traite un fichier ligne par ligne et j'aimerai qu'à la fin du traitement il appelle une autre fonction qui va prendre en paramettre le fichier traité (dans un string); donc voila mon code:

static void fonction1(files)
{
string sCra;

foreach (string filename in files)
            {
                StreamReader sR = new StreamReader(filename);
                Regex r = new Regex(@"\[([^:]+).*");
                
                string line;

                while ((line = sR.ReadLine()) != null)
                {
                    if (line.Contains("grep"))
                    {
                        string[] _split = line.Split(' ');

                        sCra = _split[4];

                        if (r.IsMatch(sCra))
                        {
                            string grp = r.Match(sCra).Groups[1].Value;
                            sCra = grp;
                        }

                        sCra += "\t"+ _split[9];
                        
                    }

                }

            }
            fonction2(sCra);
}


j'ai une erreur du type: utilisation variable sCra non assignée.
j'ai essayé plusieurs trucs sans succès. ce que je ne comprend pas:
1. ma variable est déclarée au niveau de la fonction donc devrait être utilisable partout au sein de la fonction.
2. quand j'appelle ma variable juste après 'sCra += "\t"+ _split[9];' (pour un affichage en console) cela marche bien sauf que si j'appelle ma fonction2 à cet endroit, je risque de faire un appel à chaque itération (chaque traitement de ligne).

merci pour vos réponses.

3 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
Bonjour,

Il ne s'agit pas vraiment d'une variable globale : elle est déclarée dans le corps de la méthode et 2 exécutions concurrentes de celle-ci ne toucheront pas à la même variable.

Ici le compilateur signale que tous les chemins d'exécution ne permettent pas d'initialiser la variable avant son passage à l'appel de la méthode "fonction2". C'est le cas si le fichier ne comporte aucune ligne contenant le texte "grep".
C'est à nous de prendre explicitement la décision de conserver la variable à l'état de référence nulle ou de lui donner une valeur par défaut.



Sinon tu devrais jeter un oeil à la classe StringBuilder au lieu d'enchainer un nombre indéterminé (et potentiellement grand) de concaténations de chaînes de caractères.


/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
89
Date d'inscription
mardi 19 janvier 2010
Statut
Membre
Dernière intervention
21 juin 2016
2
Merci pour ta réponse.
oui effectivement c'est ce qui se passe. en fait, ce que je voulais faire c'est passer à la "fonction2" la valeur de la variable "sCra" une fois qu'elle est passée par le foreach. sauf que comme c'est fait, et bien la variable sCra n'est jamais assignée (puisque l'appel se fait en dehors du foreach !
comment pourrais-je faire?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
84
Le problème n'est pas que l'appel se fasse en dehors du foreach (ce serait le cas si la variable était déclarée à l'intérieur de la boucle), jusque que tous les chemins ne mènent pas à une affectation explicite de la variable utilisée dans l'appel.

Donc les solutions sont diverses et reposent sur le comportement attendu par "fonction2" : en cas de valeur indéterminée, doit elle recevoir une référence nulle ou une valeur par défaut ? Ou simplement ne pas être appelée ? Ou alors est ce un cas totalement incohérent et dans ce cas le traitement doit s'arrêter là avant de risque une corruption des données ?

Si référence nulle, alors une affectation explicite à null de la variable à la déclaration suffira :
string sCra = null;

Maintenant le compilateur est sûr que c'est une réelle volontée.

Si valeur par défaut, un simple test/affectation avant appel suffira :
if(sCra == null)
{
  sCra = "Ma valeur par défaut";
}
fonction2(sCra);


etc etc :-)


/*
coq
MVP Visual C#
CoqBlog
*/