2012-11-22 20 views
3

假設我想使用2個實現IDispose模式的類。其中一個類使用另一個類來實例化,但之後不需要。在堆疊「使用」關鍵字時,這將導致(例如)在使用字體期間鎖定的文件。我想要在完成「編碼美容」原因後立即解鎖文件。

看看下面的「標籤」系統。爲什麼代碼塊是分層的?加分:寫我的代碼塊的美麗方式

using1 (Stream stream = File.OpenRead("font.ttf")) 
using2 (Font font = FontExtensions.FromStream(stream, 32)) 
ENDusing1 
//use font here 
ENDusing2 

層次方式,代碼塊如何設計,施加(美)限制在當前的處理。當然,這可以通過使用try/finally塊來解決,但這些都不是很好。

我錯過了使用(lol?)嵌套IDisposable對象/流的基本設計嗎?

請在標籤代碼塊上分享您的意見和解決此問題的最佳方法(編碼美容)。

+0

最裏面的'using'塊將被退出並佈置第一。 – IAbstract

+1

我不確定它*可以* try */finally來解決,因爲你有相同的嵌套限制,但你可以通過手動調用'.Dispose()'來解決它。 –

回答

2

您可以創建一個實用的方法來從一個臨時的資源創建對象:然後

public static T FromTempResource<T, TDisp>(Func<TDisp> dispFunc, Func<TDisp, T> createFunc) where TDisp : IDisposable 
{ 
    using(TDisp d = dispFunc()) 
    { 
     return createFunc(d); 
    } 
} 

您的例子是:

using (Font font = FromTempResource(() => File.OpenRead("font.tt"), stream => FontExtensions.FromStream(stream, 32)) 
{ 

} 
+0

幹得好,先生。 – user1190841

9

您可以嵌套使用並同時關閉甚至過早地處理流。

using (Stream stream = File.OpenRead("font.ttf")) { 
    using (Font font = FontExtensions.FromStream(stream, 32)) { 
     stream.Close(); // Or stream.Dispose(); 

     //use font here 
    } 
} 

FileStream類使用標誌的內部知道它是否已關閉或配置,並確保這不會發生兩次。 Dispose方法只是調用Close方法。

+0

這是非常漂亮的,但我不想在範圍內的流變量。 – user1190841

相關問題