1
votes

Utilisation d'une variable locale non assignée? Quelqu'un peut-il expliquer?

Je suis nouveau dans l'écriture de codes, j'en comprends quelques-uns mais je n'arrive pas à faire fonctionner certaines choses.

Je veux que cela oblige l'utilisateur à choisir une catégorie avant de lui donner accès à une, mais j'obtiens l'erreur disant "utilisation de la variable locale non attribuée". Ai-je fait quelque chose de mal?

    public static void Main(string[] args)

    {
        bool CalculateSavings, Grades;
        if (CalculateSavings == true)
        {
            int MySavings, Allowance, Food, Transportation, WeeklySavings, MonthlySavings;

            Console.WriteLine("Input your daily allowance:");
            Allowance = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Input your daily food expenses:");
            Food = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Input your daily transportation expenses:");
            Transportation = Convert.ToInt32(Console.ReadLine());

            {

                MySavings = Allowance - (Food + Transportation);
                Console.WriteLine("Your calculated daily savings: {0}", MySavings);

                WeeklySavings = MySavings * 5;
                Console.WriteLine("Your calculated weekly savings: {0}", WeeklySavings);

                MonthlySavings = WeeklySavings * 4;
                Console.WriteLine("Your calculated monthly savings: {0}", MonthlySavings);

                Console.ReadKey();
            }


        }
        else if (Grades == true)
        {
            double Filipino, English, Science, Math, History, Average;

            Console.WriteLine("Input grade in Filipino subject:");
            Filipino = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Input grade in English subject:");
            English = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Input grade in Science subject:");
            Science = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Input grade in Math subject:");
            Math = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Input grade in History subject:");
            History = Convert.ToDouble(Console.ReadLine());

            Average = (Filipino + English + Science + Math + History) / 5;
            Console.WriteLine("Overall grade average: {0}", Average);
            Console.ReadLine();

        }
    }
}

}

Faites d'abord choisir une catégorie à l'utilisateur avant de lui donner accès à une, mais j'obtiens l'erreur "utiliser de la variable locale non attribuée ".


4 commentaires

Vous utilisez CalculateSavings dans l'instruction if (CalculateSavings == true) et Grades dans l'instruction else if (Grades == true) mais aucun d'eux n'a été initialisé, seulement déclaré.


Quelle ligne jette l'erreur?


Vous déclarez les variables booléennes bool CalculateSavings, Grades mais vous ne les initialisez pas. Eh bien, comme ce sont des types de valeur, ils sont initialisés par le runtime. Mais le compilateur veut vous protéger contre les erreurs imprudentes car il sait avec certitude que vous n'avez pas attribué de valeur avant l'utilisation.


Vous devez toujours initialiser la valeur avant de l’utiliser. Cela s'applique du niveau d'assembleur le plus bas à .NET. Plus de "langages" métalliques "prendront aveuglément tous les bits qui seront écrits dans ces emplacements de mémoire (à partir de ce qui y a été écrit en dernier), mais le compilateur .NET est bien plus proactif dans la prévention des problèmes.


4 Réponses :


1
votes

Vous devez définir vos variables. Comme:

bool CalculateSavings = true;
bool Grades = true;

Le compilateur C # n'autorise pas les variables non attribuées pour éviter d'éventuelles erreurs.


2 commentaires

Manque de l'explication demandée pourquoi le compilateur se plaint. Peut-être que OP pense qu'un bool est false par défaut. Outre le fait que cela ne ferait que masquer un bogue car le bloc Grades ne sera jamais entré. Ces booléens doivent être déterminés par l'entrée utilisateur.


Si c'était la solution, quel serait l'intérêt de les avoir en premier lieu? La logique conditionnelle pourrait simplement être supprimée entièrement. Je ne pense pas que la question dispose actuellement de suffisamment d'informations pour fournir une réponse complète.



0
votes

Dans le code que vous avez ajouté à la question, vous définissez des variables avec bool CalculateSavings, Grades; , mais vous ne les attribuez pas (comme bool myVariable = true ). < / p>

Et juste après, vous essayez de les utiliser ( (CalculateSavings == true) ), mais comment C # devrait-il les comparer et les utiliser?

Donc, pour résoudre votre problème, vous devez leur attribuer true ou false pour bool.

Les variables non attribuées sont comme: vous avez besoin de papier toilette, vous savez ce que c'est, mais vous ne l'avez pas du tout. (mais pas nul).


3 commentaires

Je ne sais pas si l'analogie du papier toilette est utile ;-)


Qui vous a dit que c'est :) Je voulais juste que les gens sachent que vous devriez toujours acheter du papier toilette


Son message ajoute plus que n'importe lequel de vos commentaires jusqu'à présent.



2
votes

Vous devez également écrire une instruction if else comme l'exemple suivant

bool CalculateSavings = true;
bool Grades = true;

Vous devez également attribuer des valeurs aux variables.

  if (CalculateSavings){
            // your Code
        }else if (Grades){  
     // your Code
   }

En raison de la variable non attribuée c # donne des erreurs.


0 commentaires

0
votes

Vous pourriez éventuellement faire une analogie avec les boîtes de stockage en tant que variables.

Autrement dit, vous avez reçu deux boîtes du grenier, alors vous les étiquetez CalculateSavings et Grades. La prochaine chose que vous voulez est de choisir un chemin en fonction de ce qu'ils contiennent.

Ce que le compilateur vous dit, c'est qu'il n'y a aucun moyen d'être sûr de ce qu'ils contiennent (il aurait pu y avoir quelque chose stocké dans ces boîtes une fois prises du grenier). Par conséquent, le contenu n'est pas fiable. Le compilateur ne nettoie et n'initialise pas automatiquement les variables locales, il vous donne plutôt la possibilité de choisir ce que cette valeur devrait être.

Donc, mettre une valeur initiale lors de la déclaration d'une variable locale répondrait à cette préoccupation. Il sait alors ce qu'il y a dans une boîte et peut continuer en toute sécurité.

bool CalculateSavings = false, Grades = true; // An example of initialized variables.


0 commentaires