以功能的方式概括“使用”

时间:2016-02-08 09:30:39

标签: c# .net functional-programming

我一直在浏览我的c#代码并尝试将其中的大部分转换为更具功能性。

如何将使用表达式转换为更具功能性的模式?

    using (var stream = File.OpenWrite(Path.Combine(settingsFolder, settingsFilename)))
    using (var writer = new someClass(stream))
    {
        writer.Write(settings);
    }

我正在尝试使用此功能模式(将使用替换为 Disposable):

public static class Disposable
{
    public static TResult Using<TDisposable, TResult>(
        Func<TDisposable> factory,
        Func<TDisposable, TResult> map)
        where TDisposable : IDisposable
    {
        using (var disposable = factory())
        {
            return map(disposable);
        }
    }
}

由于类File是静态密封的,这种模式是否会起作用?

1 个答案:

答案 0 :(得分:2)

嗯,确实有效。我不确定你为什么要这样做,但是File是静态的并不会阻止你以任何方式这样做。 Func需要工厂委托,而不是可以实例化的类。

此代码适用于您:

Disposable.Using
    ( () => Disposable.Using
                ( () => File.OpenWrite(path)
                , stream => new someClass(stream)
                )
    , writer => { writer.Write(settings); return true; }
    );

但是处理时存在问题,因为内部using已经处理掉了。如果可能,您应该在stream中处理someClass。如果不可能,请使用using

return true完全存在,因为Func需要返回类型。在这种情况下,Action更适合。