IDataParameter[] clonedParameters = new IDataParameter[originalParameters.Length];
int i = 0;
int j = originalParameters.Length;
while (i < j)
{
   clonedParameters[i] = (IDataParameter)((ICloneable)originalParameters[i]).Clone();
   i++;
}请问一下这段代码中的
clonedParameters[i] = (IDataParameter)((ICloneable)originalParameters[i]).Clone();
这么写的目的是什么

解决方案 »

  1.   

    目的是说
    originalParameters[i] 他应该有实作 ICloneable 接口,而且是 Explicit implement
    所以要先转型成 ICloneable 然後呼叫他的 Clone 方法,呼叫完成後的回传对象(我猜是 object)
    再转型成 IDataParameter 这个接口
      

  2.   

    这段代码我是在微软的企业库里看的,里面的originalParameters是原先存放在一个Hash变量里,当第二次执行数据库操作的时候会先在这个Hash变量查找原先是否有对应的参数集合在里面,有的话就取出来,然后执行上面的那段代码,我只是不明白为何要将克隆parameter
      

  3.   

    他这个Hashtable变量是通过Hashtable.Synchronized(new Hashtable())这样创建的,我估计是考虑到多个用户同时进行数据库操作,并且执行的命令是一致的时候,会同时读取该缓存变量中的参数集合出来,这个时候是不是应为考虑到线程同步,所以使用克隆来做处理,这样引用的地址不是同一个对象,就比较安全?
      

  4.   

    http://topic.csdn.net/u/20111005/19/bba9cd47-e275-4f9d-a14f-789076932703.html?44313
      

  5.   

    分析其实就是“猜测”的代名词。我们做需求分析其实就是“先猜测需求然后设计解决方案”——当然,扯远了。你的那段代码,如果不那样写它就编译不过去。你试一试,看看是不是编译不过去。很简单,IDataParameter接口根本没有使用ICloneable接口,而开发者自己知道它传给这段代码的数据对象不但是兼容于IDataParameter接口的,而且也兼容于ICloneable接口。所以,当然,既然它只是声明了变量类型为IDataParameter,只好通过强制类型转换来调用它的ICloneable接口方法。这其实就说明了一个基本知识。传递进来的对象不一定是什么类型的,反正它兼容于IDataParameter接口,这是编译器通过类型检测可以保证的。比如传进来的是一个OleDbParameter类型的对象实例,的数组,被赋值给 clonedParameters 变量。编译器无法在编译这段代码之前知道谁会调用它,只能按照IDataParameter[]类型来看待clonedParameters 变量,并且编译其代码,这就是多态。
      

  6.   


    你自己其实已经考虑到了!既然它先把参数提取出来,并且缓存起来以便服用,那么它肯定怕用户(你或者其它程序员)通过DbCommand对象找到 Parameters,然后修改它。因为一旦修改了,缓存的东西就修改了,那么以后所有程序就乱了,责任就分不清了。就算你调用(而不修改它),你也只能调用到克隆的对象。