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

本文关键字:局部变量 Using 不能 为什么 | 更新日期: 2023-09-27 18:36:11

我还在学习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
            }
        }
    }
} 

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

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

string myVar;
while (someNonConstantCondition)
{
    myVar = someValue;
}
return myVar;

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

我建议将代码更改为:

if (reader.Read())
{
    return reader.GetString("column1").Trim();
}

。并使用using语句来确保自动释放所有命令等。(您已经有了这些using语句,因此无论如何都可以删除对conn.Close()conn.Dispose()cmd.Dispose()的调用。

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

接下来,您需要考虑如果reader.Read()返回false会发生什么......是否要引发异常?还别的东西?通过将 return 语句直接放在您设法读取某些数据的位置,如果您无法读取某些数据会发生什么问题就更清晰了,IMO。

要修复错误更改 -

string myVar = string.Empty;

问题就在这里

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

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

编译器

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

string myVar = "";

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

1)在同时块之前设置一个值,

myVar = string.Empty;

或更好2) 在声明变量的位置分配一个初始值,

string myVar = string.Empty;