C#的using语句是否会对输出参数调用Dispose方法?

3

假设我有:

using(DbDataReader reader = getReader("SELECT * FROM Cmds", out DbCommand cmd))
{

}

我编写了一个辅助方法,名为getReader,用于获得DbDataReaderDbCommand。在这种情况下,using语句是否调用输出参数cmdDispose方法?如果不是,有没有更简洁的方法来实现这一点,而不是使用类似以下的代码:

DbCommand cmd = null;
try
{
    using(DbDataReader reader = getReader("select value from cmds where typeid = 2;", out cmd))
    {

    }
}
finally
{
    cmd?.Dispose();
}

我可以返回一个包含两个可丢弃对象的元组吗?还是这会让using语句混淆?

我查看了C#中using语句的MSDN文档,但它没有提及在表达式中使用out参数。


2
我怀疑它不关心这些变量。在许多情况下,这将是不良的副作用。你如何区分? - ZorgoZ
2个回答

9

在这种情况下,使用using语句是否会调用输出参数cmd的Dispose方法?

不会,它只会在using语句的括号内直接创建/分配/传递实例时调用Dispose

您可以使用多个using语句并将它们堆叠在一起,像这样。

using(DbDataReader reader = getReader("SELECT * FROM Cmds", out DbCommand cmd))
using(cmd)
{

}

同时要注意,在第一个 using 语句之后缺少开/闭括号,这减少了代码缩进并使得在第二个 using 语句处处置 cmd 后无法引用它。

1
谢谢确认,这已经足够简洁了! - Craig Silver

1
你可以编写一个简单的IDisposable包装类并返回它:
public sealed class DbData: IDisposable
{
    public DbData(DbDataReader reader, DbCommand command)
    {
        Reader  = reader;
        Command = command;
    }

    public void Dispose()
    {
        Reader .Dispose();
        Command.Dispose();
    }

    public DbDataReader Reader  { get; }
    public DbCommand    Command { get; }
}

然后你的GetReader()将返回一个DbData
public DbData GetReader(string sql)
{
    DbDataReader reader  = ...;
    DbCommand    command = ...;

    return new DbData(reader, command);
}

然后你可以使用 using 来完成这个操作。
using (var result = GetReader("SELECT * FROM Cmds"))
{
    // Do something with result.Command and result.Reader
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接