声明MySqlDataReader而不初始化它
本文关键字:初始化 MySqlDataReader 声明 | 更新日期: 2023-09-27 18:10:05
我想声明一个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 */ }
}
这样做的原因是我想关闭MySqlDataReader在最后一节的尝试,如果它实际上我得到一个运行时错误。所以MySqlDataReader必须在try之前声明,否则它将超出finally代码的作用域。
然而,当我编译上面的代码,我得到编译时错误"使用未分配的局部变量'rdr'",所以我想把它设置为一些东西,例如
MySqlDataReader rdr = New MySqlDataReader();
但是这给了我一个编译时错误"类型"MySql.Data.MySqlClient。MySqlDataReader"没有定义构造函数"。分配命令对象的结果将使代码编译,但这可能会出错,这就是我的尝试试图捕获的。
当这个函数第二次被调用时,如果MySqlDataReader对象没有从第一次迭代中关闭,那么它将在第二次循环时崩溃。
那么,当事情出错时,我如何清理我的MySqlDataReader对象?
将其指定为null
。编译器会知道已经赋值的值,尽管它是null
。
MySqlDataReader rdr = null;
在您的finally
块中,检查null
值。
MySqlDataReader rdr = null;
try
{
... // do stuff here
}
finally
{
if (rdr != null)
{
// cleanup
}
}
或者如果可能的话使用using
。它将为您清理rdr
:
using (MySqlDataReader rdr = ... )
{
}
一个选项是将其初始化为null
,以:
MySqlDataReader rdr = null;
毕竟,您已经在示例代码的finally
块中检查了它是否为空,所以这很好。
不清楚为什么你不只是使用using
语句。