我想声明一个MySqlDataReader,而不是初始化它或为它赋值。像下面的代码一样。
MySqlDataReader rdr;
try
{ /* stuff to open the MySqlDataReader and use it, not important for my question */ }
catch (Exception e)
{ /* error handling stuff, not important for my question */ }
finally
{
/* code to close the reader when things have gone wrong */
try
{
if (rdr != null)
{
if (rdr.IsClosed == false)
{
rdr.Close();
}
}
}
catch (Exception e)
{ /* error handling stuff, not important for my question */ }
}
原因是我想在try的finally部分中关闭MySqlDataReader,如果它实际上我确实得到了运行时错误。因此,必须在try之前声明MySqlDataReader,否则它将超出finally代码的范围。
然而,当我编译上面的代码时,我得到编译时错误"使用未分配的局部变量' rdr'"所以我想把它设置成例如
MySqlDataReader rdr = New MySqlDataReader();
但是这给了我一个编译时错误"类型' MySql.Data.MySqlClient.MySqlDataReader'没有定义构造函数"。并且分配命令对象的结果将使代码编译但是可能出错并且是我尝试捕获的内容。
如果第一次迭代时没有关闭MySqlDataReader对象,则第二次调用此函数时,它将第二次崩溃。
那么当出现问题时如何清理我的MySqlDataReader对象?
答案 0 :(得分:2)
只需为其分配null
即可。编译器将知道已分配的值,尽管它是null
。
MySqlDataReader rdr = null;
在finally
区块中,查看null
值。
MySqlDataReader rdr = null;
try
{
... // do stuff here
}
finally
{
if (rdr != null)
{
// cleanup
}
}
如果可能,请使用using
。它将为您清理rdr
:
using (MySqlDataReader rdr = ... )
{
}
答案 1 :(得分:1)
一种选择是将其初始化为null
以开始:
MySqlDataReader rdr = null;
毕竟,您已经在示例代码的finally
块中检查它是否为空,所以没关系。
目前尚不清楚为什么你不仅仅使用using
语句。你总是可以在里面(或外面)放一个try / catch。