为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
泛舟湖上清波郎朗 2021-11-07 18:59:15
假设我有: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表达式中获得的参数的任何内容。
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

cmd在这种情况下, using 语句是否对输出参数调用 Dispose ?


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


您可以使用多个using语句并像这样堆叠它们。


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

using(cmd)

{


}

还要注意在第一条using语句之后缺少开/关括号,这减少了代码缩进,并且cmd在第二条using语句处理后无法引用。


查看完整回答
反对 回复 2021-11-07
?
白衣非少年

TA贡献1155条经验 获得超0个赞

您可以编写一个简单的 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

}


查看完整回答
反对 回复 2021-11-07
  • 2 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信