You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JetBrains Rider提示可消除闭包,该如何修复此问题?

修复Disposable.Create的闭包提示问题

Rider提示的核心是当前代码里的Disposable.Create通过lambda捕获了subscriber和channel变量,形成了闭包。而Rx的Disposable.Create提供了带状态参数的重载,可以直接传递需要的上下文,避免闭包创建。

修复方案

使用Disposable.Create<TState>重载,把要用到的subscriber和channel打包成状态参数传递进去,替代原来捕获变量的lambda:

public IObservable<RedisValue> SubscribeAsync(TKey key)
{
    var channel = CreateChannel(key);
    var subscriber = _connectionMultiplexer.GetSubscriber();

    return Observable.Create<RedisValue>(observer =>
    {
        subscriber.SubscribeAsync(channel, (redisChannel, redisValue) =>
        {
            if (!string.IsNullOrEmpty(redisValue))
            {
                observer.OnNext(redisValue);
            }
        });
        // 使用带状态参数的重载,避免闭包
        return Disposable.Create((subscriber, channel), state => 
            state.subscriber.Unsubscribe(state.channel));
    });
}

原理说明

这个重载允许我们预先把需要的上下文(这里是subscriber和channel组成的元组)作为第一个参数传入,第二个参数是接收该状态的Action。这样代码不会捕获外部变量,也就不会生成闭包,既符合Rider的提示要求,也能减少闭包对象的分配开销。

如果觉得元组不够直观,也可以手动定义一个小型类来封装状态,但用C#元组是最简洁的实现方式。

内容的提问来源于stack exchange,提问作者nop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:13:11