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
相关产品推荐
相关产品推荐

