V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
noli
V2EX  ›  程序员

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

  •  
  •   noli · Sep 30, 2018 · 1122 views
    This topic created in 2765 days ago, the information mentioned may be changed or developed.

    摘要:介绍一种方式控制生命周期对性能有影响的对象,以达到类似 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);
        }
    }
    
    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4848 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 04:03 · PVG 12:03 · LAX 21:03 · JFK 00:03
    ♥ Do have faith in what you're doing.