3

IDispose パターンを実装する 2 つのクラスを使用したいとします。クラスの 1 つは、インスタンス化のために他のクラスを使用しますが、その後は必要ありません。「using」キーワードをスタックすると、(たとえば) フォントを使用している間、ファイルがロックされます。「コーディングの美しさ」の理由から、ファイルを使い終わった直後にファイルのロックを解除したい。

次の「タグのような」システムを見てください。

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

コードブロックがどのように設計されるかという階層的な方法は、これの現在の処理に(美しさの)制限を課します。もちろん、これは try/finally ブロックを使用して解決できますが、これらは適切ではありません。

(笑) ネストされた IDisposable オブジェクト/ストリームを使用する基本的な設計が欠けていますか?

tag-code-blocks とこれを解決する最善の方法 (コーディングの美しさ) について意見を共有してください。

4

2 に答える 2

9

usings をネストし、同時にストリームを閉じるか、時期尚早に破棄することもできます。

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

        //use font here
    }
}

クラスは内部でフラグを使用して、FileStream閉じられたか破棄されたかを認識し、これが 2 回発生しないようにします。メソッドはDisposeメソッドを呼び出すだけCloseです。

于 2012-11-22T15:44:15.530 に答える
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))
{

}
于 2012-11-22T15:58:40.493 に答える