2010-06-22 63 views
5
using (Font font3 = new Font("Arial", 10.0f), 
      font4 = new Font("Arial", 10.0f)) 
{ 
    // Use font3 and font4. 
} 

我知道使用子句可以在内使用同一类型的多个对象。我可以使用*块在C#*中使用不同类型的对象吗?

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

嗯,我试过,但尽管他们不同的名称和不同的对象,他们的行为同样=有同样的一套方法

是否有使用使用类不同类型的任何其他方式?

如果不是,使用它的最合适的方法是什么?

回答

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

} 

像这样?

10

不,你不能这样做,但你可以nestusing块。

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

说实话 - 我发现后者更具可读性。如果您正在初始化三个或四个项目(如流,StreamReader,Stream,Streamwriter),嵌套可能完全失去控制!我想这可能是你习惯的。 – 2010-06-22 10:42:51

+1

这完全取决于个人。你用你喜欢或喜欢的方式使用它。 – 2010-06-22 10:46:43

+0

虽然不言而喻,但一致性是最重要的。 – etc 2010-06-22 10:58:44

3

您只能在每个using块中初始化一种类型的对象。您可以嵌套的,只要你想尽可能多的,但是:

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

    } 
} 
+0

实际上,您可以拥有多个相同类型的对象,如问题所示。 – Codesleuth 2010-06-22 12:49:42

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. 
    } 
} 
+0

您是否有链接指出它们以相反顺序处理的文档? – Dolphin 2010-06-22 14:59:36

+0

我想我在课程上听说过,但是,堆叠它们与嵌套它们是一样的。见修改文本。 – 2010-06-22 18:26:19

+1

从C语言的语法中很容易看出。 * using-statement *的语法是:using(* variable initialization *)* statement *请注意,堆叠和大括号都不是语法的明确部分。它们被递归语法所暗示。当* statement *是一个using语句时,您可以进行堆栈。当* statement *是* block-statement *时,您有大括号。 – 2010-06-23 01:13:14

6

可以叠加使用的语句来实现:

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

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

http://adamhouldsworth.blogspot.com/2010/02/things-you-dont-know.html

+0

我已在您的博客上评论了您的链接中的foreach示例。 – 2010-06-22 12:24:43

+0

好点,我改变了它 - 它看起来好像正在发生,但所发生的一切都是编译器让你忽略括号{},它只是一个嵌套的foreach。 – 2010-06-22 12:42:06

5

using语句目的是保证所获取的资源被明确地通过向Dispose方法的调用由IDisposable接口提供设置。该规范不允许您在单个使用语句中获取不同类型的资源,但考虑到第一句话,您可以使用编译器编写这个完美有效的代码。

using (IDisposable d1 = new Font("Arial", 10.0f), 
    d2 = new Font("Arial", 10.0f), 
    d3 = new MemoryStream()) 
{ 
    var stream1 = (MemoryStream)d3; 
    stream1.WriteByte(0x30); 
} 

然而,我不建议这,我认为这是侮辱性的,所以这个答案只是为了说明您可以破解它周围,但你可能不应该。

+0

投票向我们展示*不*要做的事情。 – 2010-06-22 14:52:42

相关问题