是否可以通过使用块在同一个内部声明2变量来使代码更紧凑?

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


评论

不要使用新的XmlTextReader()。使用XmlReader.Create()

从.NET 2.0开始不推荐使用新的XmlTextReader()。通过使用XmlReader.Create(),您将获得尽可能最好的派生XmlReader类,而不仅仅是一个XmlTextReader类。

#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如何为此提供显式支持(否则它将缩进第二条语句)。

–康拉德·鲁道夫(Konrad Rudolph)
2012-02-22 13:53



@KonradRudolph我的问题有点令人困惑,但是我想问这是否实际上是为多种用途设计的离散语言功能,或者与(x)if(y){z; }。我认为您的评论回答了这一点;我正在阅读后者?

– ssube
2012年2月22日在14:21

@peachykeen是的,这绝对不是离散语言功能,而只是嵌套块。但是,IDE确实出于缩进的目的对其进行了特殊处理。

–康拉德·鲁道夫(Konrad Rudolph)
2012年2月22日14:40

我真的希望C#的使用形式不会开始新的块,而是将变量放在声明它们的块的末尾,例如:{using var x = new Reader(); x.Read(); }

– Stefan Dragnev
2014年9月5日在6:24



IL代码仍然保持不变。在所有两个嵌套的try finally块中,将在IL代码中生成该块。稍后实例化的xtr变量放置在内部的finally块中,而之前实例化的sr变量放置在外部的finally块中。

– RBT
2015年5月5日13:26

#2 楼

以下仅适用于相同类型的实例!感谢您的评论。

此示例代码来自MSDN:

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


评论


这仅在变量属于相同类型时才有效。

– Mohammad Dehghan
2012年2月22日在13:54

如果两个对象属于同一类型,这似乎才起作用

– Antony Scott
2012年2月22日在13:55

然后将变量声明为IDisposable并稍后进行转换?

– RobertJørgensgaardEngdahl
2015年5月7日在8:17

@RobertJørgensgaardEngdahl:是的,也可以。刚刚尝试过。

–松鼠杀手
16-10-14在12:09