1

我现在正在编写 C# 函数,它必须返回我的用户密码。一切都很好,但是我试图编译这个项目,VS 告诉我未分配的变量。

string sqlLoginCheck (string userId)
    {
        string database, host, user, pass, sqlParams, sqlQuery;
        string resultPassword;

        database = "db";
        host = "localhost";
        user = "root";
        pass = "....";

        sqlParams = "Database=" + database + ";Data Source=" + host + ";User Id=" + user + ";Password=" + pass;
        sqlQuery = "SELECT `id`, `name`, `pass` FROM `users` WHERE name = '" + userId + "' LIMIT 1";

        MySqlConnection sqlConnection = new MySqlConnection(sqlParams);
        MySqlCommand sqlCommand = new MySqlCommand(sqlQuery, sqlConnection);

        // Выполняем
        try
        {
            sqlConnection.Open();

            MySqlDataReader sqlReader = sqlCommand.ExecuteReader();

            if (sqlReader.HasRows)
            {
                while (sqlReader.Read())
                {
                    resultPassword = sqlReader[2].ToString();
                }
            }
            else
            {
                resultPassword = "";
            }
        }

        catch (MySqlException sqlError)
        {
            errorMessage.Text = "Ошибка: " + sqlError.Message;

            FileInfo errorLog = new FileInfo("errorLog.txt");

            if (errorLog.Exists == false)
            {
                FileStream errorFs = errorLog.Create();
                errorFs.Close();
            }

            StreamWriter errorSw = errorLog.AppendText();

            errorSw.WriteLine(DateTime.Now + " | " + sqlError.Message);
            errorSw.Close();
        }

        finally
        {
            sqlConnection.Close();
        }

        return resultPassword;

    }   

在这里我无法返回 resultPassword,因为变量未分配:|

4

5 回答 5

2

将此变量声明为

string resultPassword = null;

或者您可以将其声明为

string resultPassword = String.Empty;

在那种情况下,你真的不需要

else
{
            resultPassword = "";
}

因为在声明时已经设置了密码的默认值。

于 2012-07-03T09:54:13.667 回答
1

是在函数体中声明的resultPassword,但它只在try块内初始化:所以在异常的情况下,变量将被取消分配。

初始化块外的变量try-catch

这里有一些细节。

于 2012-07-03T09:55:08.853 回答
0

编译器发现有可能永远不会分配 resultPassword (如果您进入 Catch 或 finally。只需执行以下操作:

string resultPassword = ""; 

在声明中

于 2012-07-03T09:55:33.117 回答
0

这是因为在 resultPassword 永远不会被赋值的方法中存在一个根。正如其他人所说,声明:

string resultPassword = null;
于 2012-07-03T09:55:40.220 回答
0

我会建议

string resultPassword = ""; 

然后如果你需要设置为未找到,实际上将其设置为“**未找到**”或其他内容。就目前而言,您的代码中有未设置变量的路径-例如,它进入了捕获区域。

于 2012-07-03T09:55:59.567 回答