C# 简单的基本问题

C# 简单的基本问题,c#,java,windows-phone-7,C#,Java,Windows Phone 7,很抱歉问这么简单的问题,但我想澄清一个概念 下面是我在for循环中创建字典的代码 if(condition) { // some code here for(int i=0; i<length; i++) { Dictionary<string, string> parameter = new Dictionary<string, string>(); parameter.Add("ServiceTypeID", "1"); pa

很抱歉问这么简单的问题,但我想澄清一个概念

下面是我在for循环中创建字典的代码

if(condition)
{
  // some code here
  for(int i=0; i<length; i++)
  {
    Dictionary<string, string> parameter = new Dictionary<string, string>();
    parameter.Add("ServiceTypeID", "1");
    parameter.Add("Description", "disc");
  }
}
if(条件)
{
//这里有一些代码

对于(int i=0;i,在大多数实际情况下,差异接近于零

人们可能会认为清除数据结构比初始化空结构要快。情况并非总是如此。请注意,现代语言(C#,Java)内存管理器针对分配许多小对象进行了优化(这与垃圾收集器的工作方式有关)在C++中,由于缺少GC,内存管理器被调到了几个大对象的分配。因此,在循环中重新构造字典与清除它是可比的(性能上的)。 此外,clear()可能不一定释放所有分配的内存。它可能只是重置一些指针/索引。因此,如果使用clear(),您的字典可能仍会占用大量内存,这可能会减慢代码的其他部分


一句话:不要担心,除非探查器告诉您这是您程序的瓶颈。

如果这两种解决方案都适合您,您应该记住两项:

  • 第一种方法是在每个循环中创建dictionary对象,由于在每个循环中分配内存,所以速度较低
  • 第二个更快。但是使Dictionary对象保持活动状态的时间更长,因此如果GC不对其执行任何操作,内存将被占用!(GC在作用域结束后删除它)因此在长代码块中,占用内存的时间更长

    • 就性能而言,第二个循环显然更好,因为您只创建一个对象,然后在循环中添加项目

      但是,在第一个循环中,参数变量没有用处,因为在for的末尾,它不再存在


      同样,在第二个循环中,您也遇到了同样的问题……在循环结束时,如果该引用不可用……

      您能解释一下您试图做什么吗?这两个循环都没有任何意义……只是好奇,但是clear调用不允许GC收集所有不再引用的KeyValuePairs吗?IIRC GC删除对象a的语句作用域结束后,这是错误的:对象只是标记为收集,实际上对GC的操作几乎没有控制权(除了使用GC的公共方法)。但是如果有内存请求,并且内存不足,GC将采取操作…
      if(condition)
      {
        Dictionary<string, string> parameter = new Dictionary<string, string>();
        // some code here
        for(int i=0; i<length; i++)
        {
          parameter.clear();
          parameter.Add("ServiceTypeID", "1");
          parameter.Add("Description", "disc");
        }
      }