c#HashSet源码解析

本文深入剖析C#中HashSet的源码,指出其内部结构与Dictionary高度相似,主要区别在于HashSet只存储value。文章讨论了HashSet的Add函数,批评了其中使用+1,-1进行索引存储的方式,认为这导致了逻辑不清晰,且可以优化。
摘要由CSDN通过智能技术生成

看到HashSet源码的时候,我惊了一下,因为我发现HashSet的内部实现跟Dictionary几乎是一模一样的,传送门:抛除C++旧印象(二):C#Dictionary源码剖析。差别仅在于HashSet没有key,只有value,所以存储的时候是用value的HashCode值进行判断。

我们先来看下HashSet<T>类开始部分的代码(经过我稍微的整理):

public class HashSet<T> : ICollection<T>, ISerializable, IDeserializationCallback, ISet<T>, IReadOnlyCollection<T>
    {
        private const int Lower31BitMask = 0x7FFFFFFF;
        private const int StackAllocThreshold = 100;
        private const int ShrinkThreshold = 3;
 
#if !SILVERLIGHT
        // constants for serialization
        private const String CapacityName = "Capacity";
        private const String ElementsName = "Elements";
        private const String ComparerName = "Comparer";
        private const String VersionName = "Version";
#endif
		internal struct Slot {
            internal int hashCode;      // Lower 31 bits of hash code, -1 if unused
            internal T value;
   
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值