Различия между Dictionary.Clear и новым Dictionary ()

Каковы основные различия между Dictionary.Clear и new Dictionary() в C #? Какой из них рекомендуется для каких случаев?

28 голосов | спросил Newbie 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 19:53:51 +0400 2009, 19:53:51

8 ответов


0

Dictionary.Clear() удалит все KeyValue пары в словаре. Выполнение new Dictionary() создаст новый экземпляр словаря.

Если и только если старая версия словаря не укоренена с помощью другой ссылки, создание нового словаря сделает весь словарь, а его содержимое (не находящееся в другом месте) доступным для очистки GC.

Dictionary.Clear() сделает KeyValue пары доступны для очистки.

На практике оба варианта будут иметь очень похожие эффекты. Разница будет в том, что происходит, когда это используется внутри метода:

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
ответил Reed Copsey 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 20:04:05 +0400 2009, 20:04:05
0

Как уже было подробно рассмотрено, эффекты практически одинаковы. Clear() и new дадут вам Свежий словарь, по сути, отказывающийся от ссылок на объекты внутри него, освобождая их для сбора, если они стали рутированными.

Технически, .Clear() будет иметь преимущество перед new если вы собираетесь заполнить словарь до того же размера, что и раньше. Это потому, что он уже был бы изменен внутри, чтобы вместить количество объектов, которые у вас были в нем ранее. Создание нового словаря будет иметь новую внутреннюю хеш-таблицу с размером по умолчанию, и его придется расширять по мере добавления элементов в него.

Я также хотел бы предложить, чтобы они сообщали совершенно другое намерение, и вы должны использовать .Clear() в своем коде, когда имеете дело с тот же контекст, что и раньше. Создание нового словаря подразумевает, что вы собираетесь приступить к некоторой новой логике, имеющей дело с чем-то отличным от старого словаря, в то время как использование Clear() означает, что да, вы действительно хотели просто сбросить все, что вы сделали до сих пор с ним.

ответил womp 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 20:13:15 +0400 2009, 20:13:15
0

Dictionary.Clear ()
Это удалит все пары ключ /значение в Словаре. Сборщик мусора очистит память для этих предметов во время следующего цикла сбора мусора. MSDN

new Dictionary ()
Создает новый объект Dictionary в памяти и покидает исходный объект. Память будет очищена во время следующего цикла сбора мусора.

ответил RSolberg 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 19:57:59 +0400 2009, 19:57:59
0

Я предполагаю, что ключевое отличие состоит в том, что если вы вызовете 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».

ответил Ant 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 20:06:02 +0400 2009, 20:06:02
0

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, поскольку коллекция была изменена.

ответил Brian Gideon 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 20:11:29 +0400 2009, 20:11:29
0

Я полагаю, что .Clear () был предоставлен для того, чтобы, если ваш Словарь отображался как свойство только для чтения, вы могли удалить все элементы. Однако, если это не раскрыто таким образом, и вы имеете полный контроль, тогда может быть проще просто создать новый словарь. Может также быть небольшая разница в производительности между ними.

ответил 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 20:41:33 +0400 2009, 20:41:33
0

Если у вас есть несколько ссылок на этот словарь, и вы очистите его, вы будете влиять на них все, где, как будто вы создаете новый словарь, вы влияете только на одну новую ссылку. Я думаю, это зависит от масштаба воздействия, на которое вы нацелены. Очевидно, что вызов «new» даст вам «очищенный» словарь, но вы можете потерять другую полезную информацию о состоянии.

ответил gshauger 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 20:06:33 +0400 2009, 20:06:33
0

Dictionary.clear исключит все элементы в вашем словаре. Новый словарь создает новый объект словаря в памяти, в то же время осиротев прежний словарь, чтобы сборщик мусора мог его очистить позже.

ответил Chris Marisic 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 19:55:09 +0400 2009, 19:55:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132