我可以使用*块在C#*中拥有不同类型的对象吗?

我可以使用*块在C#*中拥有不同类型的对象吗?,c#,using,C#,Using,我知道同一类型的多个对象可以在using子句中使用 我不能在using子句中使用不同类型的对象吗 我试过了,但尽管它们是不同的名称和不同的对象,但它们的行为相同=具有相同的方法集 是否有其他方法将using类用于不同的类型 如果没有,最合适的使用方法是什么 using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f)) { // Use font3 and font4.

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

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

我试过了,但尽管它们是不同的名称和不同的对象,但它们的行为相同=具有相同的方法集

是否有其他方法将using类用于不同的类型

如果没有,最合适的使用方法是什么

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

像这样吗?

不,你不能这样做,但是你可以用
嵌套

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

}
或者正如其他人所说,但我不建议这样做,因为可读性

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
}
您可以嵌套它们:

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

    }
}
它们应按相反的顺序处理(先处理font4)

编辑:

这与:

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

您可以使用语句进行堆栈以完成以下任务:

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

您可以用逗号分隔相同类型的项—好吧,我只知道编译器不会抱怨。您还可以使用不同类型的()语句(使用一组括号{})进行堆栈


using语句的目的是保证通过调用
IDisposable
接口提供的
Dispose
方法来显式地释放所获取的资源。该规范不允许您在单个using语句中获取不同类型的资源,但考虑到第一句话,您可以根据编译器编写完全有效的代码

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

<>但是,<强>我不推荐这个< /强>,我认为它是滥用的,所以这个答案只是陈述你可以绕过它,但你可能不应该。

老实说,我发现后者更可读。如果您初始化三个或四个项目(如stream、streamreader、stream、streamwriter),嵌套可能会完全失控!我想这可能是你已经习惯了的。这完全取决于个人。你可以用你喜欢或喜欢的方式使用它。虽然不用说,一致性在这里是最重要的。如果你关心处理的顺序,我会推荐第一个,在正常情况下,第二个并不重要。我找不到任何明确说明处置顺序的参考文献,第一个参考文献明确了处置顺序。两种情况下的处置顺序相同。在这两种情况下,font3将在font4之前得到处理。我在你的博客上对链接后的foreach示例进行了评论。好的地方,我已经更改了它-看起来它正在发生,但所发生的只是编译器允许你忽略括号{},它只是一个嵌套的foreach。实际上,正如问题所示,您可以拥有多个相同类型的对象。您是否有一个指向文档的链接,说明它们是按相反顺序处理的?我想我是在一个课程中听到的,但是,堆叠它们与嵌套它们是一样的。参见修改后的文本。从类C语言的语法中很容易看出这一点。using语句的语法是:using(变量初始化)语句请注意,堆栈和大括号都不是语法的显式部分。它们由递归语法隐含。当语句是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);
}