Вопрос по c# – Не все пути кода возвращают значение

0

Я получаю сообщение об ошибке, не все пути кода возвращают значение?

    public string Authentication(string studentID, string password) // this line?
    {
        var result = students.FirstOrDefault(n => n.StudentID == studentID);
        //find the StudentID that matches the string studentID 
        if (result != null)
        //if result matches then do this
        {
            //---------------------------------------------------------------------------- 
            byte[] passwordHash = Hash(password, result.Salt);
            string HashedPassword = Convert.ToBase64String(passwordHash);
            //----------------------------------------------------------------------------
            // take the specific students salt and generate hash/salt for string password (same way student.Passowrd was created)

            if (HashedPassword == result.Password)
            //check if the HashedPassword (string password) matches the stored student.Password
            {
                return result.StudentID;
                // if it does return the Students ID                     
            } 

        }
        else
        //else return a message saying login failed 
        {
            return "Login Failed";
        }
    }
Вы уже получили ответ на свои проблемы. Тем не менее, я рекомендую вам немного изменить рефакторинг. Вместо возвращенияLogin Failed как строку, вы должны скорее вернутьnullили сложный тип, который говорит, был ли вход успешным или нет, вместе с идентификатором студента (илиnull). Matthias Meid
возможный дубликатWhy am I getting this error: not all code paths return a value? Henk Holterman
Ваш дизайн довольно уродлив, поскольку вы смешиваете волшебную нитьLogin Failed с идентификаторами студентов. Вы могли бы использоватьnull в качестве возвращаемого значения для сбоя или измените тип возвращаемого значения на что-то более сложное, возможно, какой-то различающий союз CodesInChaos

Ваш Ответ

5   ответов
1

if (HashedPassword != result.Password)

положить еще во внутреннем, если

6

если результат не нулевой, а result.Password! = HashedPassword, вы ничего не возвращаете.

Вы должны изменить что-то вроде:

...
if (HashedPassword == result.Password)
{
     return result.StudentID;
     // if it does return the Students ID                     
} 
return "Invalid Password";
...
4

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

Вы должны либо добавить условие else к вашему вложенному оператору if, например так:

if (HashedPassword == result.Password)
//check if the HashedPassword (string password) matches the stored student.Password
{
    return result.StudentID;
    // if it does return the Students ID                     
} 
else
{
    return "Login Failed";
}

или, что более желательно, удалите оператор else, который у вас уже есть, чтобы функция завершилась с ошибкой возврата имени входа:

if (result != null)
{
   //....
}

return "Login Failed";

... с этим вторым подходом вам не нужно беспокоиться об использовании else, потому что, если все ваши другие условия будут выполнены, вложенный оператор return все равно завершит функцию. Попробуйте представить это окончательное возвращение как действие по умолчанию, если какой-либо из этапов аутентификации завершился неудачно


Еще одно замечание, которое следует сделать в вашем коде, - это не идеальная практика, чтобы возвращать набор данных таким способом. то есть результатом может быть идентификатор студента или сообщение об ошибке. Попробуйте создать выделенный класс результатов с несколькими свойствами, которые вызывающий код может проверить, чтобы увидеть состояние проверки логики. Класс что-то вроде следующего будет хорошим началом:

public class LoginResult
{
   //determines if the login was successful
   public bool Success {get;set;}

   //the ID of the student, perhaps an int datatype would be better?
   public string StudentID {get;set;}

   //the error message (provided the login failed)
   public string ErrorMessage {get;set;}
}

(несмотря на все это, ваш вызывающий код уже, похоже, знает о studentID)

-2

Я сделал некоторые изменения в вашем коде. попытайся.

public string Authentication(string studentID, string password) 
{
    var result = students.FirstOrDefault(n => n.StudentID == studentID);
    var yourVar;       
    if (result != null)       
    {

        byte[] passwordHash = Hash(password, result.Salt);
        string HashedPassword = Convert.ToBase64String(passwordHash);

        if (HashedPassword == result.Password)            
        {
            //return result.StudentID;
            yourVar = result.StudenID;
            // if it does return the Students ID                     
        } 

    }
    else
    //else return a message saying login failed 
    {
        yourVar = "Login Failed";
    }
    return yourVar;
}
Error: User Rate Limit Exceededvar yourVarError: User Rate Limit ExceededyourVarError: User Rate Limit Exceeded
1

if(result != null) {
    ...
}
return "Login Failed";

Похожие вопросы