我们项目里,每个NPC都有一个数值类,包括了hp,atk,dp等值,最近发现了在获取存储数值累NumericalData时出现了GC,然后看了下C#的Dictionary源码才知道这么回事。
C#之Dictionary
下载了.Net源码之后,打开nlp.sln,查看Dictionary类,发现如果在new一个Dictionary对象时没有传实参,就会用默认的EqualityComparer.Defalut:
而EqualityComparer.Default的实现,是在堆上new出一个默认的EqualityComparer来。
而我们项目里,使用的结构是
private IDictionary<UlongUint, NumericalData> m_npcNumericalMap = null;
UlongUint是一个自定义struct,ulong用来保存npc的characterID值,uint来保存不同角色的具体的tableID。由于struct是值类型,而且UlongUint没有自己实现IEqualityComparer的Equals和GetHas