Pie*_*ten 9 .net c# dictionary hashtable
有人告诉我,在C#规范中字符串变为不可变的原因之一是为了避免在对字符串键的引用改变其内容时HashTables的密钥发生变化的问题.
Dictionary <>类型允许将引用类型用作键.字典如何避免导致"错放"值的更改密钥的问题?当用作键时,是否存在由对象构成的成员克隆?
该Dictionary<TKey,TValue>类型不会尝试防止用户修改所使用的密钥.纯粹由开发人员负责不改变密钥.
如果你想到这一点,这真的是唯一Dictionary<TKey,TValue>可以采取的理智的路线
.考虑在对象上执行类似成员克隆的操作的含义.为了彻底,您需要进行深度克隆,因为密钥中引用的对象也可能会发生变异,从而影响哈希代码.所以现在表中使用的每个键都有克隆的完整对象图,以防止突变.这将是错误的并且可能是非常昂贵的操作.
如果您使用可变引用类型作为键,则默认实现GetHashCode()将保证哈希相等,而不管对象状态如何(即哈希与引用相关联,而不是与状态相关联).但是,你是正确的,具有值相等语义的可变类型(其中GetHashCode可能取决于状态)是字典键的错误选择.