2009-10-30 67 views
7

是什么的代码下面的两个片段之间的区别:“使用”和范围界定之间的区别?

using (Object o = new Object()) 
{ 
    // Do something 
} 

{ 
    Object o = new Object(); 
    // Do something 
} 

我一直在使用using了很多开始,但我很好奇,什么比实际好处用于确定对象的范围。

编辑:有用的花絮,我从这场耗时:

乔恩斯基特:

注意,这并不强制垃圾回收以任何方式,形状或形式。垃圾收集和提示资源清理有点正交。

威尔Eddins评论:

除非你的类实现了IDisposable接口,并具有的Dispose()函数,你不使用使用。

回答

20

的第一个片段在块的末尾呼吁Dispose - 你只能用它实现IDisposable类型做到这一点,并且在它基本上调用Dispose finally块,这样你就可以与需要的资源清洗类型使用例如,

using (TextReader reader = File.OpenText("test.txt")) 
{ 
    // Use reader to read the file 
} 
// reader will be disposed, so file handle released 

注意这并没有垃圾收集以任何方式,形状或形式。垃圾收集和提示资源清理有点正交。

基本上,你应该使用using声明几乎任何实现IDisposable和你的代码块将负责(在清理方面)的任何东西。

+0

这是否公平地说出这一点,当你需要清理你的班级可能拥有的非托管资源时,这种情况最为适用?还是它也适用于纯管理类? – 2009-10-30 16:20:53

+0

+1关于垃圾收集的说明,我总是有一种忘记它的倾向... – jdehaan 2009-10-30 16:21:35

+0

好吧,用于存储数据结构的典型对象不会从使用子句中看到任何好处,但会看到一个较重的对象IDisposable会? – Kelsey 2009-10-30 16:21:44

3

using的末尾处理对象(放在括号内的对象必须实现IDisposable)。对象也会在异常情况下处理。而且您不必等待GC在某个时间执行操作(您可以控制它)。

编辑:作用域的缺点是:

  • 你不控制对象的倾向
  • 即使你会打电话处置你的作用域结束,它不会是例外安全
1

请参阅有关IDisposable和可确定的资源释放的文档。

简单地说,在using{}块的末尾,你可以可靠处置分配的资源(例如关闭文件句柄,数据库连接等。)

0

using只需要实现IDisposable接口,并在范围末尾调用Dispose方法。

有关正确处理对象的大量争论,还有很多其他线程。

3

只是从字面上示区别...

using (FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate)) 
{ 
    //stuff with file stream 
} 

是一样的...

{ 
    FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate); 

    try 
    { 
    //stuff with filestream 
    } 
    finally 
    { 
    if (fileStream != null) 
     ((IDisposable)fileStream).Dispose(); 
    } 
} 

其中作为

{ 
    FileStream fileStream = new FileStream("log.txt", FileMode.OpenCreate); 
    fileStream.Dispose(); 
} 

是因为它是。

+0

+1就是一个很好的例子。 – Kelsey 2009-10-30 17:17:09