2012-09-26 44 views
0

我一直在研究一些代码。我有一个问题:使用“using”的实例化与简单实例化有什么区别

这两个代码有什么区别?

using (FORM formExemple = new FORM()) 
{ 
formExemple.ShowDialog(); 
} 

FORM formExemple = new FORM(); 
formExemple.ShowDialog(); 
+4

请不要打电话给你的'FORM'类型。 1)不要在变量/类型名称中使用所有大写字母2)给它一个更有意义的名称。 – Servy

回答

8

using调用对象的方法在完成后自行清理。它通常处理诸如关闭打开的连接和/或释放内存之类的事情。如果您实例化它,否则您必须手动执行此操作。对于实现IDisposable接口的对象,只能使用using,这可确保该对象存在方法Dispose()

+0

正确。请记住Dispose()没有什么不可思议的。您可以从IDisposable继承,并创建Dispose()方法,但除非实际手动编写代码,否则实际上只是调用一个空方法。关于使用它的好处是它确实调用了dispose(),并且它限制了范围。 –

+0

@RyanTernier我几乎放了一个免责声明,“Dispose'并不是魔术,但我决定反对它,因为我认为最后一句暗示'Dispose()'只是接口的一部分 –

6

的使用块用于自动处理实现IDisposable的一个对象。 第一个得到Dispose()在块的末尾被调用。在例外情况下,使用块还将确保对象正确处置。

第二个不需要开发人员处理时,他们确定他们不再需要该对象。

5

和往常一样,请查阅文档 - MSDN C# guide for using statements或C#规范(C#5规范中的第8.13节)。

using语句只能与两类实施IDisposable被使用,并且它基本上可以确保任何资源在inital表达式出现(在资源获取表达)设置在块的末尾,即使一个异常被抛出。你的第一个代码段是大致等同于:

FORM formExemple = new FORM(); // I hope you don't *really* use these names 
try 
{ 
    formExemple.ShowDialog(); 
} 
finally 
{ 
    formExemple.Dispose(); 
} 

还有比这更给它一点点,你要知道:

  • 在资源获取表达式声明的任何变量的作用域是using声明本身
  • 它科佩斯空值
  • 它科佩斯与using语句中更改变量(值仍然迪sposed)

基本上,这使得它更容易清理需要及时处置资源 - 网络流,文件处理,数据库连接,图形对象等

-1

using语句定义formExemple范围,分配给formExemple的内存将在using语句的控制之外被释放一次。

+1

不一定。 'Using'将调用对象的Dispose()方法,它可以做任何想做的事情。 –

+0

无论垃圾收集器如何释放内存,内存都将被释放。一旦超出范围,它将被*合格*收集。这可能是在使用块结束之后(但如果你仍然坚持引用它,你可以这样做)。无论如何,这不是用途的*目的*,它只是一个副作用。你可以使用一个没有任何使用的代码块:'{Form f = new Form();}' – Servy

+0

那么除非你重写默认情况下正在发生的Dispose()方法吗? – AnthonyFG

4

using是您可以与实现IDisposable接口的对象一起使用的东西。使用使用的理由是一旦你完成了你的表单,你不必担心任何清理,表单上的Dispose方法将被调用,并且所有内容都将被清除。

在你的第二个例子,处置,不会被调用的对象仍然在内存中,可能是一段时间,如果垃圾收集器无法识别,它需要把它清理干净。

2

using-statement ...

using (Font font1 = new Font("Arial", 10.0f)) 
{ 
    byte charset = font1.GdiCharSet; 
} 

...被用于以下模式的句法快捷方式(语法糖):

{ 
    Font font1 = new Font("Arial", 10.0f); 
    try 
    { 
     byte charset = font1.GdiCharSet; 
    } 
    finally 
    { 
     if (font1 != null) 
     ((IDisposable)font1).Dispose(); 
    } 
} 

(I接过的例子从上面的链接)

...因此您的两个代码片段try +拨打IDisposable.Dispose()finally -block。

+0

@AnthonyFG同意后超出范围。感谢您的编辑! – ulrichb