Alex___P Ответов: 2

Использование нераспределенного локальную переменную ошибки


Я подключаю код для проверки пароля,пароль должен содержать не менее 1 прописной буквы, 1 строчной буквы, 1 цифры и иметь минимальную длину 12 символов, если один или несколько из этих критериев не выполняются, сводка выводится на консоль, позволяя пользователю увидеть, почему пароль не был принят. Код выглядит так, как показано ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please enter a valid password");
            Console.WriteLine("Password must be minimum 12 characters long");
            Console.WriteLine("Password must contain at least one numerical value");
            Console.WriteLine("Password must contain at least one Upper case character");
            Console.WriteLine("Password must contain at least one Lower case character");

            // Variable declaration
            bool bolValidLength;
            bool bolValidUpper;
            bool bolValidLower;
            bool bolValidPassword;

            //Password declaration
            string Password = Console.ReadLine();

            //Loop program if password not acceptable

                //Checking Password Length
                int lengthPass(string pass)
                {
                    int num = 0;

                    foreach (char ch in pass)
                    {
                        if (char.IsDigit(ch))
                        {
                            num++;
                            bolValidLength = true;
                        }
                    }
                    return num;
                }

                //Checking Password for uppercase letters
                int upperCase(string pass)
                {
                    int num = 0;

                    foreach (char ch in pass)
                    {
                        if (char.IsUpper(ch))
                        {
                            num++;
                            bolValidUpper = true;
                        }
                    }
                    return num;
                }
                //Checking Password for lowercase letters
                int lowerCase(string pass)
                {
                    int num = 0;

                    foreach (char ch in pass)
                    {
                        if (char.IsLower(ch))
                        {
                            num++;
                            bolValidLower = true;
                        }
                    }
                    return num;

                }
            do
            {
                //Min pass length declaration
                const int MIN_Length = 12;

                if (Password.Length >= MIN_Length && lengthPass(Password) >= 1 && upperCase(Password) >= 1 && lowerCase(Password) >= 1)
                {
                    Console.WriteLine("The Password is good");
                    bolValidPassword = true;
                    bolValidLength = true;
                    bolValidLower = true;
                    bolValidUpper = true;
                }
                else
                {
                    Console.WriteLine("The Password is not good");
                    Console.WriteLine("Please enter a valid password");
                    Console.WriteLine("Password must be minimum 12 characters long");
                    Console.WriteLine("Password must contain at least one numerical value");
                    Console.WriteLine("Password must contain at least one Upper case character");
                    Console.WriteLine("Password must contain at least one Lower case character");
                }

                if (bolValidLength == false)
                {
                    Console.WriteLine("The Password length is too short");
                }

                if (bolValidUpper == false)
                {
                    Console.WriteLine("The Password did not contain an Uppercase letter");
                }

                if (bolValidLower == false)
                {
                    Console.WriteLine("The Password did not contain a Lowercase letter");
                }
            }
            while (bolValidPass == false);
        }
    }
}
**************************************************************************************

bolValidLength, bolValidUpper, bolValidLower have 'use of unassigned local variable' error

bolValidPass, errors appear as 'does not exist in the current context' and ' is assigned but it's value is never used'

What I have tried:

Any help is much welcomed as i have been stuck on this for the past week. Thank you

phil.o

То, что вы сделали, так оскорбительно! Пожалуйста, не удаляйте свой вопрос после того, как ответы будут предоставлены. Это делает пост бесполезным и является признаком глубокого неуважения к другим пользователям этого форума.

Richard MacCutchan

Исправлено.

phil.o

Спасибо, Ричард.

2 Ответов

Рейтинг:
2

OriginalGriff

Причина проста: система может видеть возможный маршрут через код, который может привести к тому, что переменная будет использована (т. е. прочитана или проверена), прежде чем вы фактически назначите ей значение. То, что маршрут маловероятен или даже фактически невозможен на практике, не имеет отношения к компилятору - он не "знает", что будет в других переменных, таких как пользовательский ввод.

Например:

string s = "123";
bool b;
foreach (char c in s)
    {
    if (c != 'a') b = true;
    }
if (b) Console.WriteLine("YES");
На практике, b всегда будет оставаться true после цикла - но система не может полагаться на это и говорит вам, потому что вы можете легко изменить его на этот:
string s = Console.ReadLine();
bool b;
foreach (char c in s)
    {
    if (c != 'a') b = true;
    }
if (b) Console.WriteLine("YES");
И если пользователь просто нажимает ENTER, то b никогда не придается значения.

Поэтому всегда давайте переменным значение по умолчанию:
bool bolValidLength = false;
и у тебя не будет никаких проблем.


Рейтинг:
0

phil.o

// Variable declaration
bool bolValidLength = false;
bool bolValidUpper = false;
bool bolValidLower = false;
bool bolValidPassword = false;
Вам просто нужно дать вашим переменным некоторое значение при инициализации. Компилятор больше не будет жаловаться на неинициализированные переменные.

Но есть еще одна проблема в вашем коде: в C# вы не можете объявить (неанонимный) метод внутри другого метода.
Метод lengthPass, upperCase и lowerCase нужно быть перемещенным из Main метод.


OriginalGriff

"в C# нельзя объявить (неанонимный) метод внутри другого метода."
Да, вы можете:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/local-functions

Мне это не нравится, но он был добавлен в C# 7.0

phil.o

Спасибо за информацию, мне она тоже не нравится. У меня такое чувство, что C# превращается в гигантскую кучу беспорядка.
Скорее всего, OP просто скопировал какой-то код проверки javascript и еще не использует "функции" C# 7.0.