问题一、
    public static DbParameter[] GetCachedParameters(string cacheKey)
        {
            var cachedParms = (DbParameter[])_parmCache[cacheKey];            if (cachedParms == null)
                return null;            var clonedParms = new DbParameter[cachedParms.Length];            for (int i = 0, j = cachedParms.Length; i < j; i++)
                clonedParms[i] = (DbParameter)((ICloneable)cachedParms[i]).Clone();            return clonedParms;        }这是微软DBhelper的一段获取参数缓存的代码,为什么不是直接用缓存中的,而是要从缓存中的对象克隆一个出来,具体看我加粗的地方
问题二、Hashtable缓存需要注意哪些问题,比如线程安全同时写入的问题

解决方案 »

  1.   

    为什么需要Clone,这是因为不是每个缓存对象都只要返回其引用即可,有些时候对象数据可能不能被使用两次以上。比如将一个DataRow同时添加到两个DataTable是不允许的。所以这里调用了Clone接口方法,具体Clone什么东西就看这个缓存对象里面的Clone是怎么实现的。有些是浅克隆有些深克隆。操作Hasttable的时候线程lock一下就行了
      

  2.   

    使用clonedParms 是为了保持原cachedParms 不发生改变。
      

  3.   


    protected static Hashtable _cache = Hashtable.Synchronized(new Hashtable());这样声明,是不是就可以不用Lock也是安全的啦?