0

我想声明一个 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,如果它确实确实出现了运行时错误。所以 MySqlDataReader 必须在 try 之前声明,否则它将超出 finally 代码的范围。

但是,当我编译上面的代码时,我得到编译时错误“使用未分配的局部变量'rdr'”,所以我想将它设置为例如

MySqlDataReader rdr = New MySqlDataReader();

但这给了我一个编译时错误“'MySql.Data.MySqlClient.MySqlDataReader' 类型没有定义构造函数”。并且分配命令对象的结果将使代码编译但是可能会出错,这就是我的尝试试图捕捉的。

当第二次调用这个函数时,如果 MySqlDataReader 对象没有从第一次迭代中关闭,那么它将第二次崩溃。

那么当出现问题时如何清理我的 MySqlDataReader 对象呢?

4

2 回答 2

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 = ... )
{
}
于 2014-06-23T10:35:03.547 回答
1

一种选择是将其初始化为null

MySqlDataReader rdr = null;

毕竟,您已经finally在示例代码的块中检查它是否为 null,所以这很好。

目前尚不清楚为什么您不只是使用using声明。你总是可以在里面(或外面)放一个try/catch。

于 2014-06-23T10:34:54.780 回答