/// <summary> /// 从对象池获取对象 /// </summary> /// <returns></returns> public System.Object RentObject() { lock (this) { if (FreeCount() <= 0 && ExtendPool() == false) { return(null); } Int32 nHashCode = (Int32)m_FreeIndexArray[0]; m_FreeIndexArray.RemoveAt(0); System.Object obj = m_ItemTable[nHashCode]; m_UsingIndexArray.Add(nHashCode); if (m_bSupportRecycle == true) { IRecycleable recyObj = (IRecycleable)obj; if (recyObj != null) { recyObj.Init(); } } #if BTDEBUG if (m_ItemUseFrequencyTable.Contains(nHashCode) == false) { m_ItemUseFrequencyTable.Add(nHashCode, 0); } Int32 nFrequency = (Int32)m_ItemUseFrequencyTable[nHashCode]; m_ItemUseFrequencyTable[nHashCode] = nFrequency + 1; #endif return(obj); } }
/// <summary> /// 释放对象 /// </summary> /// <returns></returns> public bool GiveBackObject(System.Object obj) { lock (this) { if (obj == null) { return(false); } if (m_UsingIndexArray == null || m_FreeIndexArray == null || m_ItemTable == null) { return(false); } if (m_bSupportRecycle == true) { IRecycleable recycleable = (IRecycleable)obj; if (recycleable != null) { recycleable.Clear(); } } Int32 nHashCode = obj.GetHashCode(); if (m_UsingIndexArray.Contains(nHashCode) == false) { return(false); } m_UsingIndexArray.Remove(nHashCode); m_FreeIndexArray.Add(nHashCode); return(true); } }
public static void Return(IRecycleable obj) { Console.WriteLine("Pool::Return"); pool.Add(obj); }