【问题标题】:Why are code blocks hierarchical? Extra points: Beautiful way to write my code block为什么代码块是分层的?加分:编写代码块的好方法
【发布时间】:2012-11-22 15:37:50
【问题描述】:

假设我想使用 2 个实现 IDispose 模式的类。其中一个类使用另一个类进行实例化,但之后不需要。当堆叠“使用”关键字时,这将导致(例如)在使用字体期间锁定文件。出于“编码美观”的原因,我希望文件在完成后立即解锁。

看看下面的“类似标签”的系统。

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

分层方式,代码块的设计方式,对当前的处理施加了(美)限制。当然,这可以通过使用 try/finally 块来解决,但这些块并不那么整洁。

我是否缺少使用(大声笑?)嵌套 IDisposable 对象/流的基本设计?

请分享您对标记代码块的看法以及解决此问题的最佳方法(编码之美)。

【问题讨论】:

  • 最里面的using 块将被首先退出和处理。
  • 我不确定它可以使用try/finally 解决,因为您有相同的嵌套限制,但您当然可以通过手动调用来解决它.Dispose().

标签: c# code-formatting


【解决方案1】:

您可以嵌套使用,同时关闭甚至提前处理流。

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 方法。

【讨论】:

  • 这很漂亮,但是我不希望流变量在范围内。
【解决方案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-03-06
    • 1970-01-01
    • 2012-11-29
    • 2013-05-26
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多