看到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;