C# 的 using 语句是否对 out 参数调用 Dispose?

假设我有:


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

{


}

我在那里编写了一个辅助方法,getReader以获取 aDbDataReader和 a DbCommand。在这种情况下,using语句是否调用Dispose输出参数cmd?如果没有,是否有一种简洁的方法来实现这一目标,而不是像这样的:


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表达式中获得的参数的任何内容。


泛舟湖上清波郎朗
浏览 204回答 2
2回答

BIG阳

cmd在这种情况下, using 语句是否对输出参数调用 Dispose ?不,不是的。它只调用Dispose直接在using语句括号内创建/分配/传递的实例。您可以使用多个using语句并像这样堆叠它们。using(DbDataReader reader = getReader("SELECT * FROM Cmds", out DbCommand cmd))using(cmd){}还要注意在第一条using语句之后缺少开/关括号,这减少了代码缩进,并且cmd在第二条using语句处理后无法引用。

白衣非少年

您可以编写一个简单的 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}
打开App,查看更多内容
随时随地看视频慕课网APP