日期:2014-05-20  浏览次数:20712 次

PetShop4.0 源代码分析 C# 克隆 ICloneable使用
[align=left]
C# code
//Create a hashtable for the parameter cached
        private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

C# code
  public static OracleParameter[] GetCachedParameters(string cacheKey) {
            OracleParameter[] cachedParms = (OracleParameter[])parmCache[cacheKey];

            if (cachedParms == null)
                return null;

            // If the parameters are in the cache
            OracleParameter[] clonedParms = new OracleParameter[cachedParms.Length];

            // return a copy of the parameters
            for (int i = 0, j = cachedParms.Length; i < j; i++)
                clonedParms[i] = (OracleParameter)((ICloneable)cachedParms[i]).Clone();

            return clonedParms;
        }

C# code

 private static OracleParameter[] GetOrderParameters() {
            OracleParameter[] parms = OracleHelper.GetCachedParameters(SQL_INSERT_ORDER);

            if (parms == null) {
                parms = new OracleParameter[] {                                                 
                    new OracleParameter(PARM_ORDER_ID, OracleType.Number, 10),
                    new OracleParameter(PARM_USER_ID, OracleType.VarChar, 80),
                    new OracleParameter(PARM_DATE, OracleType.DateTime),
                    new OracleParameter(PARM_SHIP_ADDRESS1, OracleType.VarChar, 80),
                    new OracleParameter(PARM_SHIP_ADDRESS2, OracleType.VarChar, 80),
                    new OracleParameter(PARM_SHIP_CITY, OracleType.VarChar, 80),
                    new OracleParameter(PARM_SHIP_STATE, OracleType.VarChar, 80),
                    new OracleParameter(PARM_SHIP_ZIP, OracleType.VarChar, 50),
                    new OracleParameter(PARM_SHIP_COUNTRY, OracleType.VarChar, 50),
                    new OracleParameter(PARM_BILL_ADDRESS1, OracleType.VarChar, 80),
                    new OracleParameter(PARM_BILL_ADDRESS2, OracleType.VarChar, 80),
                    new OracleParameter(PARM_BILL_CITY, OracleType.VarChar, 80),
                    new OracleParameter(PARM_BILL_STATE, OracleType.VarChar, 80),
                    new OracleParameter(PARM_BILL_ZIP, OracleType.VarChar, 50),
                    new OracleParameter(PARM_BILL_COUNTRY, OracleType.VarChar, 50),
                    new OracleParameter(PARM_TOTAL, OracleType.Number),
                    new OracleParameter(PARM_BILL_FIRST_NAME, OracleType.VarChar, 80),
                    new OracleParameter(PARM_BILL_LAST_NAME, OracleType.VarChar, 80),
                    new OracleParameter(PARM_SHIP_FIRST_NAME, OracleType.VarChar, 80),
                    new OracleParameter(PARM_SHIP_LAST_NAME, OracleType.VarChar, 80),
                    new OracleParameter(PARM_AUTHORIZATION_NUMBER, OracleType.Int32)};

                OracleHelper.CacheParameters(SQL_INSERT_ORDER, parms);
            }

            return parms;
        }
    }

想问下为什么
 // If the parameters are in the cache
  OracleParameter[] clonedParms = new OracleParameter[cachedParms.Length];

  // return a copy of the parameters
  for (int i = 0, j = cachedParms.Length; i < j; i++)
  clonedParms[i] = (OracleParameter)((ICloneable)cachedParms[i]).Clone();
这里需要克隆一个新的OracleParameter[] 出来返回给调用函数,而不直接返回从OracleParameter[] cachedParms = (OracleParameter[])parmCache[cacheKey];取的的OracleParameter[]
这个克隆在这里的作用和技巧是什么。请高手指教。
[/align]


------解决方案--------------------
避免参数属于其他执行对象。