Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么代码块是分层的?额外要点:编写代码块的漂亮方法_C#_Code Formatting - Fatal编程技术网

C# 为什么代码块是分层的?额外要点:编写代码块的漂亮方法

C# 为什么代码块是分层的?额外要点:编写代码块的漂亮方法,c#,code-formatting,C#,Code Formatting,假设我想使用两个实现IDispose模式的类。其中一个类使用另一个类进行实例化,但之后不需要。当堆叠“使用”关键字时,这将导致(例如)在使用字体期间锁定文件。出于“编码美观”的原因,我希望在处理完文件后立即将其解锁。 看看下面的“标签式”系统 分层方式,即代码块的设计方式,对当前的处理方式施加了(美)限制。当然,这可以通过使用try/finally块来解决,但它们没有那么整洁。我是否缺少使用(lol?)嵌套IDisposable对象/流的基本设计?请分享您对标记代码块的看法以及解决这一问题的最佳

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

看看下面的“标签式”系统


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

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

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

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

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

您可以创建一个实用方法,从临时资源创建对象:

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

最里面的
using
块将首先退出并释放。我不确定是否可以使用
try
/
最终解决它,因为您有相同的嵌套限制,但是您当然可以通过手动调用
.Dispose()
来解决它。这非常漂亮,但是我不希望流变量在范围内。
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))
{

}