声明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对象?

声明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语句。