2013-03-28 37 views
1

我有一个字典问题。小例子:如果我发送函数,更改字典

 Dictionary<int, bool> dict = new Dictionary<int, bool>(); 
     for (int i = 0; i < 5; i++) 
     { 
      dict.Add(i, true); 
     } 
     var dict2 = dict; 
     dict2.Clear(); 

此后,我必须清除字典。我需要做什么,如果我需要一本改变的字典和一本不变的字典?

+1

'dict2.Clear()'也清除'dict',我想这是不希望的,是吗? – 2013-03-28 08:43:17

+0

是的!问题在这。 – EXTRAM 2013-03-28 08:44:37

+1

试试这一个:var dict2 = dict.ToDictionary(x => x.Key,x => x.Value); – Killo 2013-03-28 08:46:33

回答

4

创建一个副本,而不是仅仅复制引用:

var dict2 = new Dictionary<int, bool>(dict); 
+0

谢谢。你的回答非常有帮助! – EXTRAM 2013-03-28 08:44:55

2

由于Dictionary类,所以它是一个reference type

当你写

var dict2 = dict; 

你居然分配dictdict2相同的引用。这就是为什么当你想使用Clear()方法,它影响他们两个。您应该复制它们而不是复制它们的引用。喜欢;

var dict2 = new Dictionary<int, bool>(dict); 

C# Language Specification;

值类型的变量直接包含其数据,而变量的引用类型引用存储 他们的数据,后者是 称为对象。使用参考类型时,两个变量可能引用同一个对象,因此可能对一个变量操作 以影响由其他变量引用的对象。对于值类型,变量每个都有自己的 数据副本,并且不可能对一个到另一个的操作影响另一个 。