C# 之 Dictionary字典的赋值

举报
陈言必行 发表于 2021/08/13 22:26:47 2021/08/13
【摘要】 C# 之 Dictionary字典的赋值 Dictionary<TKey,TValue> 类,表示键和值的集合。 Dictionary<TKey,TValue> 泛型类提供一组键到一组值的映射。 每次对字典的添加都包含一个值和与其关联的键。 使用其键检索值的速度非常快。 之前使用Dictionary,也没遇到什么问题,感觉很方便,通过键...

C# 之 Dictionary字典的赋值

Dictionary<TKey,TValue> 类,表示键和值的集合。

Dictionary<TKey,TValue> 泛型类提供一组键到一组值的映射。 每次对字典的添加都包含一个值和与其关联的键。 使用其键检索值的速度非常快。


之前使用Dictionary,也没遇到什么问题,感觉很方便,通过键值对的形式进行新建 – 存储 – 校验Key/Value是否存在 – 读取 – 修改/移除维护,一切正常。

近期取犯了一个不应该犯的错 – 赋值。

	class Program { static List<List<int>> handCards = new List<List<int>>(); static void Main(string[] args) { //声明 赋值 Dictionary<int, int> dic1 = new Dictionary<int, int>(); dic1.Add(1, 1); dic1.Add(2, 2); Dictionary<int, int> dic2 = dic1; dic2.Add(3, 3); dic2.Add(4, 4); foreach (var item in dic1.Keys) { Console.WriteLine("dic1 : " + dic1[item]); } foreach (var item in dic2.Keys) { Console.WriteLine("dic2 : " + dic2[item]); } } }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

111

这种赋值的方式是直接将dic2指向了dic1的内存地址,其实就是一个人,叫两个名字而已,所以这时不管你叫谁他都有反应, 即对dic1和dic2进行的所有操作都是一个内存地址进行修改,也就是说对dic1修改就是对dic2修改。
对于这种概念,我们最初学习引用类型的时候就已经有过接触了,所以说,大家也基本不会犯这样的错误。
需要注意的是,当我们使用Dic作为参数的时候,对它遍历时,尽量不要在外部对它进行添加/删除元素,否则可能会遇到这错:Unity 报错 之 InvalidOperationException: out of sync。
还有一种情况就是,当我们需要多个操作校验的时候,有多个方法同时执行,对这个Dic进行操作,也会产生问题。

那么,问题来了,想像值类型那么赋值该怎么写呢?
	class Program { static List<List<int>> handCards = new List<List<int>>(); static void Main(string[] args) { //声明 赋值 Dictionary<int, int> dic3 = new Dictionary<int, int>(); dic3.Add(1, 1); dic3.Add(2, 2); //相当于值类型赋值 Dictionary<int, int> dic4 = new Dictionary<int, int>(dic3); dic4.Add(3, 3); dic4.Add(4, 4); foreach (var item in dic3.Keys) { Console.WriteLine("dic3 : " + dic3[item]); } foreach (var item in dic4.Keys) { Console.WriteLine("dic4 : " + dic4[item]); } } }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

222

这样的话就可以只是用Dictionary的值,新开辟了一块内存地址,而不会对它本身有影响。

文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。

原文链接:czhenya.blog.csdn.net/article/details/103673322

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。