Dictionary.Clear
とnew Dictionary()
の主な違いは何ですか?どちらのケースにお勧めですか?Dictionary.Clearとnew Dictionary()の相違点
答えて
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
@divo - 私は彼が参照、オブジェクト自体のコピーではありません –
@ジョン:それはまさに私が意味していたものです。それはコピーです - 辞書への参照のコピー –
Dictionary.clearは、辞書内のすべての項目を削除します。新しいディクショナリは、ガベージコレクタが後でクリーンアップするために前のディクショナリを孤立させながら、新しいディクショナリオブジェクトをメモリに作成します。
Dictionary.Clear()
この辞書内の全てのキー/値のペアを削除します。ガベージコレクタは、次のガベージコレクションサイクル中にこれらのアイテムのメモリをクリアします。 MSDN
新しい辞書()
メモリに新しい辞書オブジェクトを作成し、元のオブジェクトを破棄する。メモリは、次のガベージコレクションサイクル中にクリアされます。
MSDNの記事は、処分について何も言及していません。 –
何か考慮すべき点 - 辞書が非常に大きく、クリア後にほぼ同じ量のデータを読み込んでいることが確実であれば - Dictionary.Clear()が辞書の容量をリセットしないという事実それはより魅力的です。 – overslacked
@overslacked - まあまあ私はちょうどそのことを示唆する答えを書く時間を費やした。 – womp
私は重要な違いは、あなたが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'を出力します。
+1 - これは主要な違いです。 – Joe
この辞書に複数の参照があり、それをクリアすると、新しい辞書を作成した場合のように、その新しい参照にのみ影響します。私はそれがあなたが目指している影響の範囲に依存すると思います。明らかに "new"への呼び出しはあなたに "クリアされた"辞書を与えますが、他の有用な状態情報を失うかもしれません。
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);
}
}
最初の例では、元のコレクションのすべての内容が印刷されます。これは、列挙子が新しいインスタンスに再割り当てされる前に参照変数から作成されたためです。
2番目の例では、列挙中にコレクションがクリアされ、コレクションが変更されたためにInvalidOperationException
になります。
広範にカバーされているように、効果は本質的に同じです。 Clear()
とnew
は、両方ともあなたに新鮮な辞書を提供します。基本的には、その中のオブジェクトへの参照を放棄して、それらがルーティングされなかった場合に収集されるようにします。
.Clear()
は、以前と同じサイズに辞書を再投入しようとした場合、new
を超える利点があります。これは、既に内部にあるオブジェクトの数を保持するために内部的にサイズが変更されているためです。新しいディクショナリを作成すると、デフォルトのサイズの新しい内部ハッシュテーブルが作成され、アイテムを追加するときに再展開する必要があります。
また、全く異なる意図を伝えることをお勧めします。以前と同じコンテキストを扱う場合は、コードに.Clear()
を使用する必要があります。新しいディクショナリを作成すると、古いディクショナリとは異なる何らかの新しいロジックを実装しようとしていることを意味しますが、Clear()
を使用すると、それまでに行ったことをすべてリセットするだけでした。
あなたの辞書が読み取り専用のプロパティとして公開されている場合、すべてのアイテムを削除できるように、.Clear()が提供されていると思います。しかし、それがそのように公開されておらず、完全な制御権を持っていれば、新しい辞書をインスタンス化するほうが簡単かもしれません。両者のパフォーマンスに若干の違いがあるかもしれません。
- 1. DjangoのQuerySet、Tuple、Dictionaryの相違点
- 2. importとconstとの相違点とcommonjsでの相違点
- 3. =と:=の相違点
- 4. PHPUnitとPHPSpecの相違点と相違点
- 5. MSBuildとTFSBuildの相違点
- 6. string.hとstrings.hの相違点
- 7. NSArrayとNSMutableArrayの相違点
- 8. System.Web.CacheとHTTPContext.Curent.Cacheの相違点
- 9. saveとsave_model()の相違点
- 10. ディスパッチキューとNSOperationQueueの相違点
- 11. HTML5とjQueryの相違点
- 12. QtGui.QApplicationとQtCore.QCoreApplicationの相違点
- 13. CDO.MessageとSystem.Net.Mailの相違点
- 14. TransactionとTransactionScopeの相違点
- 15. addonGlobalLayoutListenerとaddOnPreDrawListenerの相違点
- 16. getGenericParameterTypesとgetParameterTypesの相違点
- 17. vmlinuxとvmlinux.oの相違点
- 18. KeyEventArgs.systemKeyとKeyEventArgs.Keyの相違点
- 19. Thread.sleep()とTimeUnit.SECONDS.sleep()の相違点
- 20. レポートとサブレポートの相違点
- 21. MPI_ScatterとMPI_Bcastの相違点
- 22. V8とECMAScriptの相違点
- 23. カーネルモードとドライバの相違点
- 24. アルゴリズムとメソッドの相違点
- 25. mysql_num_rowsとmysql_affected_rowsの相違点
- 26. modelAttributeとcommandNameの相違点
- 27. システムとshell_execの相違点
- 28. 'コミット'と 'リビジョン'の相違点
- 29. 'コンポーネントアーキテクチャ'と 'モジュラアーキテクチャ'の相違点
- 30. scipy.spatial.KDTreeとscipy.spatial.cKDTreeの相違点
パフォーマンス関連:[より高速なコレクションの収集またはインスタンス化の新機能](http://stackoverflow.com/questions/10901020/which-is-faster-clear-collection-or-instantiate-新しい) – nawfal