在C#的using块中,我可以使用不同类型的对象吗?

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

我知道在 using 子句中可以使用多个相同类型的对象。

我能否在 using 子句中使用不同类型的对象?

我尝试过了,虽然它们有不同的名称和不同的对象,但它们表现相同 = 具有相同的方法集。

是否有其他方法可以使用具有不同类型的 using 类?

如果没有,那么最合适的使用方式是什么?

7个回答

28
using(Font f1 = new Font("Arial",10.0f))
using (Font f2 = new Font("Arial", 10.0f))
using (Stream s = new MemoryStream())
{

}

像这样吗?


10

不,你不能这样做,但是你可以嵌套 using 块。

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

如其他人所说,但我不推荐那种方式,因为可读性不好。

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

10
说实话,我觉得后者更易读。如果你要初始化三到四个项(比如流、流读取器、流、流写入器),嵌套可能会完全失控!我想这可能是你习惯的方式。 - Rob Levine
1
这完全取决于个人。您可以根据自己的喜好或偏好使用它。 - this. __curious_geek
虽然这应该是不言而喻的,但在这里一致性是最重要的事情。 - etc
如果您关心处理顺序,我建议选择第一个;在一般情况下,第二个也可以。我没有找到任何明确说明处理顺序的参考资料,第一个可以使处理顺序变得明确无误。 - Dolphin
两种情况下处理的顺序是相同的。在这两种情况下,font3将先于font4被处理。 - this. __curious_geek
@curious:你说得对,两者的处理顺序相同,但是font4将首先被处理。 - Ben Voigt

6
您可以使用堆叠的使用语句来实现这个目标:
using(Font font3 = new Font("Arial", 10.0f))
using(Font font4 = new Font("Arial", 10.0f))
{
    // use font3 and font4
}

5
使用using语句的目的是确保通过调用IDisposable接口提供的Dispose方法来显式释放已获取的资源。规范不允许您在单个using语句中获取不同类型的资源,但是考虑到第一句话,您可以根据编译器编写完全有效的代码。
using (IDisposable d1 = new Font("Arial", 10.0f),
    d2 = new Font("Arial", 10.0f), 
    d3 = new MemoryStream())
{
    var stream1 = (MemoryStream)d3;
    stream1.WriteByte(0x30);
}

然而,我不建议这样做,因为这是滥用的行为,所以我的回答只是想说明你可以绕过它,但最好不要这样做。


3

在每个using块中,您只能初始化单一类型的对象。但是您可以无限嵌套这些块:

using (Font font3 = new Font("Arial", 10.0f))
{
    using (Brush b4 = new Brush())
    {

    }
}

实际上,您可以拥有多个相同类型的对象,就像问题所示。 - Codesleuth

3

我在你的博客上留言,关于你链接后的foreach示例。 - Ed Courtenay
不错,我已经改了 - 看起来好像是发生了什么,但实际上只是编译器让你忽略了大括号 {},这只是一个嵌套的 foreach。 - Adam Houldsworth

2
你可以嵌套它们:
using (Font font3 = new Font("Arial", 10.0f))
using (font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

应该按相反的顺序处理(先处理font4)。

编辑:

这与以下内容完全相同:

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

你有文档链接说明它们以相反的顺序处理吗? - Dolphin
我认为我在一门课程上听说过,然而堆叠它们与嵌套它们是相同的。请查看修改后的文本。 - Paul Michaels
1
从类似C语言的语法中很容易看出,using-statement 的语法是:using (变量初始化) 语句。请注意,堆叠和大括号都不是语法的显式部分,它们是由递归语法隐含的。当语句是一个using-statement时,你会得到堆叠。当语句是一个block-statement时,你有大括号。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接