代码之家  ›  专栏  ›  技术社区  ›  Newbie

Dictionary.Clear和New Dictionary()之间的差异

  •  28
  • Newbie  · 技术社区  · 16 年前

    两者的主要区别是什么 Dictionary.Clear new Dictionary() 在C?哪种情况下推荐使用哪一种?

    8 回复  |  直到 10 年前
        1
  •  33
  •   Irshad huMpty duMpty    10 年前

    Dictionary.Clear() 将删除所有 KeyValue 字典中的对。做 new Dictionary() 将创建字典的新实例。

    如果并且仅当字典的旧版本不是由另一个引用建立的,那么创建一个新字典将使整个字典和它的内容(不是在其他地方建立的)可供GC清除。

    字典.clear()) 将使 键值 可用于清理的对。

    在实践中,这两种选择的效果往往非常相似。不同之处在于,当在一个方法中使用这种方法时会发生什么:

    void NewDictionary(Dictionary<string,int> dict)
    {
       dict = new Dictionary<string,int>(); // Just changes the local reference
    }
    
    void  ClearDictionary(Dictionary<string,int> dict)
    {
       dict.Clear();
    }
    
    // When you use this...
    Dictionary<string,int> myDictionary = ...; // Set up and fill dictionary
    
    NewDictionary(myDictionary);
    // myDictionary is unchanged here, since we made a new copy, but didn't change the original instance
    
    ClearDictionary(myDictionary);
    // myDictionary is now empty
    
        2
  •  19
  •   womp    16 年前

    正如已经被广泛报道过的,效果基本上是相同的。 Clear() new 它们都会给你一个新的字典,基本上是放弃对其中对象的引用,释放出它们,以便在它们未分类时被收集。

    技术上, .Clear() 比…有优势 新的 如果你要把字典重新填充到以前的大小。这是因为它已经在内部进行了大小调整,以容纳您以前在其中拥有的对象的数量。创建一个新的字典将有一个默认大小的新的内部哈希表,并且必须在向其添加项时重新展开它。

    我也建议他们传达一个完全不同的意图,你应该使用 清除() 在您的代码中,当您处理与以前相同的上下文时。创建一个新的字典意味着你将要开始处理一些不同于旧字典的新逻辑,同时使用 清除() 表明是的,你真的想重置你迄今为止所做的一切。

        3
  •  14
  •   RSolberg    16 年前

    字典.clear())
    这将删除字典中的所有键/值对。垃圾收集器将在下一个垃圾收集周期中清除这些项目的内存。 MSDN

    新词典()
    在内存中创建新的字典对象并放弃原始对象。内存将在下一个垃圾收集周期中被清除。

        4
  •  6
  •   Ant    16 年前

    我想关键的区别是如果你打电话 Dictionary.Clear() ,将清除对该字典的所有引用。如果你使用 new Dictionary() ,则此时正在处理的引用将被清除(在某种意义上),但您拥有引用的所有其他位置将不会被清除,因为它们仍将引用旧词典。

    希望这段代码能够简单地说明这一点:

    public void Method()
    {
        Dictionary<int, int> d1 = new Dictionary();
    
        d1.Add(1,1);
        d1.Add(2,3);
    
        Dictionary<int, int> d2 = d1;
    
        //this line only 'clears' d1
        d1 = new Dictionary();
    
        d1.Add(1,1);
        d1.Add(3,5);
        d2.Add(2,2);
    
        //writes '2' followed by '1'
        Console.WriteLine(d1.Count);
        Console.WriteLine(d2.Count);
    }
    

    如果我曾打电话 d1.Clear() 相反,d1和d2将保持同步,随后的添加将添加到两者中。writeline调用将同时具有输出“3”。

        5
  •  5
  •   Brian Gideon    16 年前

    Dictionary.Clear 将移除(但不释放)实例中的所有项,而 new Dictionary() 将创建一个刚好为空的全新实例。这两者之间可能有一些微妙的含义。请考虑以下示例。

    void Example1()
    {
      var collection = new Dictionary<string, string>();
      collection.Add("key1", "value1");
      collection.Add("key2", "value2");
      foreach (var kvp in collection)
      {
        collection = new Dictionary<string, string>();
        Console.WriteLine(kvp);
      }
    }
    
    void Example2()
    {
      var collection = new Dictionary<string, string>();
      collection.Add("key1", "value1");
      collection.Add("key2", "value2");
      foreach (var kvp in collection)
      {
        collection.Clear();
        Console.WriteLine(kvp);
      }
    }
    

    在第一个示例中,将打印原始集合中的所有内容。这是因为枚举器是在重新分配给新实例之前从引用变量创建的。

    在第二个示例中,在枚举期间清除集合,这将导致 InvalidOperationException 因为集合已被修改。

        6
  •  3
  •   user16324    16 年前

    我相信提供了.clear(),这样如果您的字典作为只读属性公开,您就可以删除所有项。但是,如果它不是以这种方式公开的,并且您拥有完全的控制权,那么仅仅实例化一个新的字典可能会更容易。这两者之间也可能有轻微的性能差异。

        7
  •  1
  •   gshauger    16 年前

    如果您有多个对该词典的引用,并且清除了它,那么您将影响所有这些引用,就像创建一个新词典一样,您将只影响一个新引用。我想这取决于你想要的影响范围。显然,调用“new”会给您一个“cleared”字典,但您可能会丢失其他有用的状态信息。

        8
  •  0
  •   Chris Marisic    16 年前

    dictionary.clear将清除字典中的所有项。新字典在内存中创建新的字典对象,同时孤立上一个字典,以便垃圾收集器稍后清理。