Dart中StreamController.stream的==与identical结果不一致的原因探究
Dart Stream相等性表现的原因解析
先明确两个判断方法的本质
identical(a, b):严格校验是否为同一个内存对象实例,只有当a和b指向同一块内存地址时才返回true。==运算符:默认和identical行为一致,但很多类会重写它,用来判断逻辑意义上的相等,而非物理实例是否相同。
两次调用controller.stream的现象原因
StreamController的stream getter方法,每次被调用时都会创建并返回一个新的Stream包装对象(内部实现类如_StreamControllerStream):
- 两次调用
streamController.stream得到的stream1和stream2是不同的实例,内存地址不一样,因此identical(stream1, stream2)返回false。 - 但这个包装类重写了
==运算符,判断逻辑是:只要两个Stream对象关联的是同一个StreamController的底层数据流,就认为逻辑相等,所以stream1 == stream2返回true。
直接赋值的情况符合预期的原因
当把stream1直接赋值给stream2时,stream2只是stream1的引用,指向同一个实例,所以identical和==都会返回true,完全符合对象引用的常规逻辑。
广播流表现一致的原因
StreamController.broadcast()创建的广播控制器,其stream getter的实现逻辑和普通控制器完全相同:每次调用返回新的包装实例,但重写的==会校验是否关联同一个底层广播流,因此表现和普通流一致。
内容的提问来源于stack exchange,提问作者goodonion
相关产品推荐
相关产品推荐

