问题描述:Function1函数功能是为一个HashTable类型的对象赋值,Function2函数的参数为被赋值的那个HashTable;
方法1:(定义一个全局HashTable变量,然后Function1函数为其赋值,每次赋值前先清空,Function2函数参数为全局变量)     HashTable1;//全局变量
     while()
     {
       HashTable1.Clear();//清空
       void Function1()
       {
         HashTable1 = **; //对HashTable1进行操作
       }
       Fuction2(HashTable1);//传入参数为全局变量
     }
方法2:(在Function1函数内每次都new一个HashTable对象出来,然后为其赋值。Function2函数参数为Function1函数)
     while()
     {
       HashTable1 Function1()
       {
         HashTable1 = new HashTable(); //new一个新的HashTable
         HashTable1 = **; //对HashTable1进行操作
         return HashTable1
       }
       Fuction2(Function1());//传入参数为函数
     }请问这两种做法在循环次数较多时,那个比较好?还有就是VS.net中哪里能监控到程序运行的时间?谢谢。

解决方案 »

  1.   

    全局变量在程序运行的过程中一直存在,在程序开始的时候定义,需要用的时候声明他。从软件开发的编码的流程上也应该是这样的。可以肯定的是,每定义一个变量,分配内存空间的过程比Clear是要慢的多的,Clear的算法是经过优化的,效率很高(不太记得了,MSDN上有讲到)。第二种方法表面上没有清空零时变量的过程,但是,C#的自动释放是需要时间去自判断,这样,如果循环体很大的时候,占用的系统资源很大,这也不符合软件开发的标准。综上,第一种方法比第二种更规范,更效率!
      

  2.   

    如果说效率应该第一种好,至少没有每次循环操作的时候少创建了一次HashTable。
      

  3.   

    同意楼上的,第一种效率高。这里我们看重的是时间效率,而非是空间效率。因为本身这个HashTable并不会占用太多的内存。如果你每次都要New HashTable(),会花很多时间的。
      

  4.   

    维也纳MM...抱过的都说好...1.C#中没有全局变量的概念...任何变量都是依赖于某对象的...
    2.HashTable效率不如Dictionary<T>高...
      

  5.   

    楼上的说的没错,不过概念有些混淆。
    1,C#是面向对象的,这无可厚非。不过一个函数是一个对象,一个类也是一个对象,在一个类文件中,在外部声明的变量,在函数体中使用,相比较于函数体内部变量,我觉得称为全局变量也没有什么不可以的。当然这里的所谓全局变量是局限性的。2,关于HashTable,MSDN解释如下:
    Hashtable 对象由包含集合元素的存储桶组成。存储桶是 Hashtable 中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。哈希函数是基于键返回数值哈希代码的算法。键是正被存储的对象的某一属性的值。哈希函数必须始终为相同的键返回相同的哈希代码。一个哈希函数能够为两个不同的键生成相同的哈希代码,但从哈希表检索元素时,为每一唯一键生成唯一哈希代码的哈希函数将令性能更佳。在 Hashtable 中用作元素的每一对象必须能够使用 GetHashCode 方法的实现为其自身生成哈希代码。但是,还可以通过使用接受 IHashCodeProvider 实现作为参数之一的 Hashtable 构造函数,为 Hashtable 中的所有元素指定一个哈希函数。在将一个对象添加到 Hashtable 时,它被存储在存储桶中,该存储桶与匹配该对象的哈希代码的哈希代码关联。在 Hashtable 内搜索一个值时,将为该值生成哈希代码,并且搜索与该哈希代码关联的存储桶。例如,一个字符串的哈希函数可以采用该字符串中每一字符的 ASCII 代码并它们添加到一起来生成一个哈希代码。字符串“picnic”将具有与字符串“basket”的哈希代码不同的哈希代码;因此,字符串“picnic”和“basket”将处于不同的存储桶中。与之相比,“stressed”和“desserts”将具有相同的哈希代码并将处于相同的存储桶中。Dictionary 类与 Hashtable 类的功能相同。对于值类型,特定类型(不包括 Object)的 Dictionary 的性能优于 Hashtable,这是因为 Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。所以个人觉得,单纯看效率而不考虑吻合度,有点吹毛求疵了。
      

  6.   

    老帖子过年后没看到...看来楼主已经被误导了...不知道谁在混淆概念...不过一个函数是一个对象,一个类也是一个对象,在一个类文件中,在外部声明的变量,在函数体中使用,相比较于函数体内部变量,我觉得称为全局变量也没有什么不可以的。
    -----------
    这段话说出去会被人笑话...好好去学学OOP吧...单纯看效率而不考虑吻合度
    -----------
    吻合度?这又是什么概念?泛型是吹毛求疵?效率只是很小的一方面...强类型带来的好处不是一点半点...好好去学学泛型吧...
    知之为知之不知为不知...不要害别人...