V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
noli
V2EX  ›  程序员

在 C# 中性能敏感场合模拟 RAII 语义的一种 API 设计风格

  •  
  •   noli · 2018-09-30 13:28:42 +08:00 · 800 次点击
    这是一个创建于 2006 天前的主题,其中的信息可能已经有所发展或是发生改变。

    摘要:介绍一种方式控制生命周期对性能有影响的对象,以达到类似 RAII 的效果。利用 lambda 构造明确的作用域,当 lambda 执行完成后视作离开作用域。

    常见方式是,对生命周期敏感的资源实现一个 IDisposable 的接口 如果觉得 IDisposable 依然不够可控,可以采取这种方式。

    以一个生命周期敏感的 stream 为例, 例如 socket 的 NetworkStream, 可以这样设计 API

    Task<T> GetNetworkStreamAsync<T>(Func<MyNetworkStream, Task<T>> usingStream);
    

    使用者使用的方式

    socket.GetNetworkStreamAsync(async myStream =>
    {
        var c = await myStream.ReadAsync(.....);
        // other operations
        return c;
    });
    

    API 实现

    Task<T> GetNetworkStreamAsync<T>(Func<MyNetworkStream, Task<T> usingStream)
    {
        try
        {
            var myStream = CreateMyStream();
            return usingStream(myStream);
        }
        finally
        {
            DestroyStream(myStream);
        }
    }
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2963 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:32 · PVG 08:32 · LAX 17:32 · JFK 20:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.