CancellationTokenSource.GetHashCode返回值是否恒定,能否安全存入HashSet
问题结论
CancellationTokenSource.GetHashCode() 方法返回的哈希值在对应实例的整个生命周期内是恒定的,将 CancellationTokenSource 实例存入 HashSet、ImmutableHashSet 这类哈希集合的操作是完全安全的,你给出的示例代码可以正常运行。
具体原理
CancellationTokenSource是引用类型,且.NET官方没有重写它的GetHashCode()和Equals()方法,使用的是系统为引用类型提供的默认相等性逻辑:按引用判等、哈希码和实例绑定。- 默认引用类型的哈希码生成规则为:在实例被GC回收之前,哈希码不会发生任何变化,和实例的内部状态完全无关——哪怕你调用了
Cancel()方法、或者实例被释放了资源,哈希码也不会改变。 - 哈希集合的判断逻辑是先通过
GetHashCode()快速定位槽位,再通过Equals()做最终相等性校验,这套逻辑对默认实现的CancellationTokenSource完全适用,不会出现找不到元素、重复插入相同实例的问题。
示例代码验证
你给出的代码不会出现哈希码变动导致的异常:
ImmutableHashSet<CancellationTokenSource> TokensSet = new(); TokensSet = TokensSet.Add(myToken);
内容的提问来源于stack exchange,提问作者kofifus
相关产品推荐
相关产品推荐

