C# 为什么我不能在Using块中使用局部变量?

C# 为什么我不能在Using块中使用局部变量?,c#,C#,我仍在学习C语言的细节,所以如果这是一个初级的,请原谅我。我一直在寻找答案,但还没有找到答案 我已在函数中声明了局部变量: string myVar; 我不断得到错误,当我试图返回它时,使用了未分配的局部变量: return (myVar); 我做错了什么 public string GetSomethingFromDB() { string connectionString; string sql; string myVar; connectionStri

我仍在学习C语言的细节,所以如果这是一个初级的,请原谅我。我一直在寻找答案,但还没有找到答案

我已在函数中声明了局部变量:

string myVar;
我不断得到错误,当我试图返回它时,使用了未分配的局部变量:

return (myVar);
我做错了什么

public string GetSomethingFromDB()
{
    string connectionString;
    string sql;
    string myVar;

    connectionString = "Data Source=MyServer; Port=MyPort; User ID=someuser; Password=mypassword; Database=myDatabase";
    sql = "select something from something";
    using (AseConnection conn = new AseConnection(connectionString))
    {
        using (AseCommand cmd = new AseCommand(sql, conn))
        {
            try
            {
                conn.Open();
                using (AseDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        myVar= reader.GetString("column1").Trim();
                    }
                    reader.Close();
                    reader.Dispose();
                }
                conn.Close();
                conn.Dispose();
                cmd.Dispose();
                return (myVar);
            }
            catch (AseException ex)
            {
                //do some stuff
            }
            finally
            {
                 //do some stuff
            }
        }
    }
} 

编译器不确定myVar是否会在循环中获取值。初始化变量:

string myVar = "";

要修复错误更改,请执行以下操作-

string myVar = string.Empty;
问题就在这里

while (reader.Read())
{
    myVar= reader.GetString("column1").Trim();
}

此部分可能不会运行,myVar可能永远不会被分配,因此会出现错误。

这与using语句无关,与while循环有关。抛开一切不谈,本质上这就是问题所在:

string myVar;
while (someNonConstantCondition)
{
    myVar = someValue;
}
return myVar;
编译器说while循环体可能永远不会执行,因为条件可能为false

我建议将代码更改为:

if (reader.Read())
{
    return reader.GetString("column1").Trim();
}
。。。并使用using语句确保所有命令等都被自动释放。您已经有了使用语句的调用,因此您可以删除对conn.Close、conn.Dispose和cmd.Dispose的调用

请注意,这将仅从结果中读取第一行,而您当前正在从最后一行返回值。如果这对您很重要,那么可能会有更大的设计问题


下一步,你需要考虑如果读者。是否要引发异常?还别的吗?通过将return语句直接放在您已成功读取某些数据的位置,如果您无法读取某些数据会发生什么的问题就更清楚了,依我看。

如果没有数据可读取,myVar将没有任何价值

1在while块之前设置一个值

myVar = string.Empty;
或者更好 2在声明变量的位置指定初始值

string myVar = string.Empty;

字符串。空;没有。同样对于OP,请注意使用精确的string.Empty并不是使其工作的要求(即它不是某种特殊的初始化,-这是个人品味的问题。双方都同意!谢谢你这么清楚的回答!这很有帮助!很高兴知道!非常感谢。