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

2018-09-30 13:28:42 +08:00
 noli

摘要:介绍一种方式控制生命周期对性能有影响的对象,以达到类似 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);
    }
}
810 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/494140

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX