当前位置: 代码迷 >> C# >> 关于C# Dictionary 的一个疑点
  详细解决方案

关于C# Dictionary 的一个疑点

热度:168   发布时间:2016-05-05 02:45:00.0
关于C# Dictionary 的一个疑问
有个类 User:

public class User
{
public string id;
public UserType userType;
public UserInfo userInfo;
}


然后实现 IEqualityComparer 接口:

public class UserEqualityComparer : IEqualityComparer<User>
{
public bool Equals(User user1, User user2)
{
if (user1.id == user2.id
&& user1.userType == user2.userType)
{ return true; }

else { return false; }
}

public int GetHashCode(User user)
{
return (user.id + user.userType.ToString()).GetHashCode();
}
}


将 User 做为 Dictionary 的键来使用:

private UserEqualityComparer userComparer = new UserEqualityComparer();
private Dictionary<User, int> onlineIndex = new Dictionary<User, int>(userComparer);


之后看到了这篇文章: http://www.cnblogs.com/sun/archive/2010/01/13/1647241.html  当心Dictionary带来的一种隐式内存泄漏

在运行过程中,会变化的只有 UserInfo,所以我在想,如果按照我实现的 GetHashCode 方法,还会出现这种隐式内存泄露吗?
我觉得不会

------解决思路----------------------
链接404,你懂的
------解决思路----------------------
用户ID难道不是唯一的,难道不同的usertype下还有相同的ID存在?
你不如将ID作为唯一的标识,这样即使usertype会动态的变化也不影响key的值
------解决思路----------------------
你的感觉是正确的
------解决思路----------------------
不知道你所谓的“Dictionary带来的一种隐式内存泄漏”是什么意思?!

如果对象不能被释放、单纯是你自己的代码设计造成的,就不要胡乱怪到人家的数据结构和类型设计的头上。而要说明白为什么会泄露。

不知道你为什么去自定义 GetHashcode,看不出它有什么意义?!因此这可能造成了你没事儿的时候去纠结“泄露”。
------解决思路----------------------
你之所以去毫无意义地去搞什么 HashCode,十有八九是胡乱抄袭时髦文章的结果。而不自己分析一下这种思路有多离谱。

在你引用的这篇文章中,作者说“要想把用订单做key,就要修改器GetHashcode”。这个是误导人的。Object 是内存临时浮动对象,这怎么能做 key?

要用订单做字典的 key,言外之意(任何有过一些数据结构设计知识的人)就应该理解为要用业务意义的订单编号主键来做key,而不是用无业务意义的.net运行时随机新创建的object做key。

把靠谱的业务意义,去胡乱地弱化为不靠谱的某种程序运行时的GetHashCode,一个错误要用好几个错误去“弥补”,就造成了耗费精力去空谈HashCode 去了!
------解决思路----------------------
至于说那篇文章作者说“无法从字典中准确删除对象”,从你在这篇帖子的描述来看,你一点儿也没有看懂。所以你写的“还会出现这种隐式内存泄露吗?我觉得不会”其实是错误的,因为你没有看懂这个文章作者背后的潜台词。

博客园里边有许多文章,不弄玄虚。没说几句就号称“废话少说,上代码!”,然后抄袭自己公司里的一大段一大段的代码,然后就蜻蜓点水、含沙射影式地随便说了两句自己的目的,90%的人都容易忽略其真实的目的。这样的文章在我看来,作者自己没有勇气分析深入一点,而又特别想表现得高大上。

真正好的文章,三分篇幅在代码(其实更少),七分在文字。关键是描述清楚机制,这才是重点。你要是看了这样的文章,就不会连那个 GetHashcode 代码为什么造成字典中的对象单元无法被正确删除都没有理解,就来写这个帖子了。

不过在我看来,更重要地是不要太时髦、太技术化。这样才能保证用好、少用技术。
------解决思路----------------------
打错字了,sorry:

     不弄玄虚  -->   故弄玄虚

所以学习中千万不要以看太多的博客为主。要以论坛参与谈论为主。
------解决思路----------------------
引用:
打错字了,sorry:

     不弄玄虚  -->   故弄玄虚

所以学习中千万不要以看太多的博客为主。要以论坛参与谈论为主。

这个马甲是什么情况?
------解决思路----------------------
引用:
不过现在想想,确实不用实现什么 GetHashCode, 前面的 Equals 已经完全够用了。以后抄之前我会看看的[img=http://forum.

错了,你必须重写GetHashCode,否则两个对象即便Equals为true,你依然不能从Dictionary里拿到数据
  相关解决方案