2009-10-30 68 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