Dictionary.Clear
和 new Dictionary()
在 C# 中有什么关键区别?哪种方法适用于哪些情况?
Dictionary.Clear
和 new Dictionary()
在 C# 中有什么关键区别?哪种方法适用于哪些情况?
Dictionary.Clear()
会删除字典中的所有KeyValue
对。使用new Dictionary()
将创建一个新的字典实例。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
System.Collections.Generic.KeyValuePair
来内部存储数据:来源。" - Hugh W正如广泛报道的那样,它们的效果基本相同。 Clear()
和 new
都会给你一个全新的Dictionary,实质上放弃其中对象的引用,使它们可以被回收如果它们变成未根对象。
技术上,如果您要重新填充与之前相同大小的字典,则 .Clear()
比 new
有优势。这是因为它已经在内部调整大小以容纳您之前拥有的对象数量。创建一个新 Dictionary 将具有具有默认大小的新内部哈希表,并且必须在向其中添加项时重新扩展。
我还建议它们传达完全不同的意图,当您处理与之前相同的上下文时,应在代码中使用 .Clear()
。创建新的Dictionary意味着您即将开始处理与旧Dictionary不同的一些新逻辑,而使用Clear()
则表示您确实想要重置迄今为止与其相关的所有内容。
Dictionary.Clear()
这将删除Dictionary中的所有键/值对。垃圾回收器将在下一次垃圾回收周期清除这些项所占用的内存。MSDN
new Dictionary()
创建一个新的Dictionary对象并放弃原始对象。内存将在下一次垃圾回收周期期间被清除。
我认为关键的区别在于,如果您调用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'。
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);
}
}
我认为提供.Clear()函数是为了方便在Dictionary以只读属性暴露时,可以删除所有项。但是,如果没有以这种方式暴露,并且你完全掌控,则实例化一个新的Dictionary可能更容易。两者之间可能会有轻微的性能差异。
Dictionary.clear会清除字典中的所有项。new Dictionary会在内存中创建一个新的字典对象,同时将您之前的字典孤立起来,以便垃圾收集器稍后清理。