【问题标题】:using statement with multiple variables [duplicate]使用具有多个变量的语句[重复]
【发布时间】:2012-03-12 20:32:14
【问题描述】:

是否可以通过在同一个 using 块中以某种方式声明 2 变量来使这段代码更紧凑?

using (var sr = new StringReader(content))
{
    using (var xtr = new XmlTextReader(sr))
    {
        obj = XmlSerializer.Deserialize(xtr) as TModel;
    }
}

【问题讨论】:

  • 不要使用new XmlTextReader()。使用XmlReader.Create()
  • new XmlTextReader() 自 .NET 2.0 以来已被弃用。通过使用XmlReader.Create(),您将获得可能的最佳派生XmlReader 类,而不仅仅是一个XmlTextReader 类。
  • 拜托,这个问题并不是专门针对 XmlTextReader 的!请继续关注主题!

标签: c# using-statement


【解决方案1】:

公认的方式是链接语句:

using (var sr = new StringReader(content))
using (var xtr = new XmlTextReader(sr))
{
    obj = XmlSerializer.Deserialize(xtr) as TModel;
}

请注意,IDE 也将支持这种缩进,即它不会有意尝试缩进第二条 using 语句。

【讨论】:

  • @MD.Unicorn 是的,完全正确。这是有意的——这是 C# 提供的最简洁的方式:删除括号并省略缩进。请注意 IDE 如何为此提供 explicit 支持(否则它会缩进第二条语句)。
  • @KonradRudolph 我的问题有点令人困惑,但我想问的是这实际上是为多个usings 设计的离散语言功能,还是与if (x) if (y) { z; } 相同。不过,我认为您的评论回答了这个问题;我读的是后者?
  • @peachykeen 是的,它绝对不是一个离散的语言特性,只是嵌套块。 IDE 确实出于缩进的目的对其进行了特殊处理。
  • 我真的希望 C# 有一种using 的形式,它不会开始一个新块,而是将变量放在声明它们的块的末尾,例如:@ 987654326@
  • IL 代码仍然保持不变。在 IL 代码中生成所有两个嵌套的 try finally 块。稍后实例化的 xtr 变量被放置在内部 finally 块中,而之前实例化的 sr 变量被放置在外部 finally 块中。
【解决方案2】:

以下内容仅适用于相同类型的实例!感谢 cmets。

此示例代码来自MSDN:

using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

【讨论】:

  • 这仅适用于变量类型相同的情况。
  • 这似乎只在两个对象属于同一类型时才有效
  • 然后将变量声明为 IDisposable 并稍后转换?
  • @Robert Jørgensgaard Engdahl:是的,这也有效。刚刚试了一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 2011-06-19
  • 2014-11-10
  • 1970-01-01
  • 2017-10-25
  • 2016-12-13
相关资源
最近更新 更多