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

Jam*_*ken 0 c#

我还在学习C#的详细信息,所以请原谅我,如果这个基本的话.我一直在寻找答案,但没有找到答案.

我已经声明了局部变量(在我的函数中):

string myVar;
Run Code Online (Sandbox Code Playgroud)

当我尝试返回时,我不断收到错误"使用未分配的局部变量":

return (myVar);
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

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
            }
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

这与using语句无关,也与while循环有关.抛弃其他一切,这就是问题,实质上:

string myVar;
while (someNonConstantCondition)
{
    myVar = someValue;
}
return myVar;
Run Code Online (Sandbox Code Playgroud)

编译器说while循环体可能永远不会执行,因为条件可能是假的.

我建议将代码更改为:

if (reader.Read())
{
    return reader.GetString("column1").Trim();
}
Run Code Online (Sandbox Code Playgroud)

...并使用using语句确保所有命令等都自动处理.(你已经得到了那些using语句,这样你就可以删除的来电conn.Close(),conn.Dispose()cmd.Dispose()反正.)

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

接下来你需要考虑如果reader.Read()返回会发生什么false......你想抛出异常吗?还有别的吗?通过将return语句直接放在您已设法读取某些数据的位置,如果您无法读取某些数据会发生什么问题更清楚,IMO.


Car*_*ine 7

要修复错误更改 -

string myVar = string.Empty;
Run Code Online (Sandbox Code Playgroud)

问题出在这里

while (reader.Read())
{
    myVar= reader.GetString("column1").Trim();
}
Run Code Online (Sandbox Code Playgroud)

此部分可能无法运行,myVar可能永远不会被分配,因此错误.

  • 不带()的`string.Empty;`。 (2认同)
  • 另外对于OP,请注意精确使用`string.Empty`不是要求它工作(即它不是某种特殊的初始化),[`""也足够了](http://stackoverflow.com/questions/263191/in-c-should-i-use-string-empty-or-string-empty-or) - 这是个人品味的问题. (2认同)