0

在 Python 中,您可以执行以下操作:

with open('filename') as f, something_else(f) as thing:
    do_thing(thing)

它会做open一点,然后something_else一点。当块退出时,它将以相反的顺序“处理”它。

现在我有一些像这样的 C# 代码:

using (var cmd = new DB2Command(...)){
    using (var rdr = cmd.ExecuteReader()){
        // Magic super-duper-top-secret-code-here
    }
}

有什么方法可以合并cmdrdr一个using语句吗?

4

3 回答 3

4

仅当两个对象共享相同类型且它们不存在时,您才能执行此操作。

请注意,您不需要在外部使用大括号using,并且没有它,代码看起来更干净:

using (var cmd = new DB2Command(...))
using (var rdr = cmd.ExecuteReader())
{
    // Magic super-duper-top-secret-code-here
}

如果对象都属于同一类型,则可以执行以下操作:

using(FileStream stream1 = File.Open("", FileMode.Open)
    , stream2 = File.Open("", FileMode.Open))
{
}
于 2013-01-16T15:43:35.330 回答
2

你可以这样做:

using (var cmd = new DB2Command(...))
using (var rdr = cmd.ExecuteReader())
{
    // Magic super-duper-top-secret-code-here
}

这是它会得到的最好的。

于 2013-01-16T15:42:59.907 回答
0

所以我会尝试一些不使用 using ...

    public void processDisposables<T1, T2>(T1 type1, T2 type2, Action<T1, T2> action)
        where T1: IDisposable
        where T2: IDisposable {

            try {
                action(type1, type2);
            } finally {
                type1.Dispose();
                type2.Dispose();
            }
    }

它的用法:

    processDisposables(new MemoryStream(), new StringReader("Frank Borland is 112"), (m, s) => {
        m.Seek(0, SeekOrigin.End);
        // other stuff with IDisposables
    });
于 2013-01-16T15:54:42.897 回答