为什么我不能在 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
语句无关,而与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;