• 技术文章 >后端开发 >C#.Net教程

    浅谈C# 之 Hashtable 与 Dictionary的代码实例

    黄舟黄舟2017-03-09 15:21:12原创728
    浅谈C# 之 Hashtable 与 Dictionary的代码实例:

    Dictionary<TKey, TValue> () Hashtable()

      第一、存储的数据类型

      Hashtable不是泛型的,不是类型安全的;Dictionary是泛型的,是类型安全的;

      Hashtable的键值都是Object类型的,但是Dictionary的键值的数据类型是可以指定的。

      也就是说如果往Hashtable里面存入Object以外的数据类型,则在取出该数据时,需要对其进行显示的类型转换,才能够正常使用。而Dictionary则没有这个问题。

      从这方面讲的话,Hashtable相当于Dictionary<Object,Object>

                Hashtable ht = new Hashtable();
                Dictionary<string, int> dic = new Dictionary<string, int>();
                ht.Add("A", 1);
                dic.Add("A", 1);
                //Console.WriteLine(ht["A"]+1);     //编译错误!Object类型不能和int类型直接进行相加。
                  Console.WriteLine((int)ht["A"] + 1);//编译通过,输出结果为:2
                Console.WriteLine(dic["A"] + 1);    //编译通过,输出结果为:2

      第二、读取数据的顺序与添加数据的顺序的一致性

      Dictionary和Hashtable的读取数据的顺序和添加数据时的数据的顺序的一致性均不能够保证,或者可以说没有一致性。

      Dictionary在只添加不删除的时候能够保持读取数据的顺序和添加时候的顺序是一致的;

      但是经过删除和添加操作之后,就不能够保证读取数据的顺序和添加时候的顺序一致了。

    Dictionary<int, int> dic = new Dictionary<int, int>();
                dic.Add(0, 0);
                dic.Add(1, 1);
                dic.Add(2, 2);
    
                Console.WriteLine("仅仅经过添加元素处理之后:");
    
                foreach (KeyValuePair<int, int> kvp in dic)
                {
                    Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value);
                }
    
                dic.Remove(0);
                dic.Add(3, 3);
    
                Console.WriteLine("经过删除和添加元素处理之后:");
    
                foreach (KeyValuePair<int, int> kvp in dic)
                {
                    Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value);
                }
    
                Console.ReadKey();

    捕获

    php入门到就业线上直播课:进入学习

      对于Dicitionary而言,如果从中删除一个元素,则之后新添加的元素会填补这个被删除元素的位置,因而致使添加数据的顺序与读取数据的顺序是不一致的。

      对于Hashtable而言,它的数据存储顺序是按一定的算法算出来的,所以绝大多数情况下,它的数据读取顺序和数据添加顺序是不一致的。

      所以如果你需要保持数据添加时的顺序的时候,最好不要用Dictionary和Hashtable。

      第三、当用一个不存在的Key值到Hashtable或者Dictionary中取值时

      对于Hashtable而言,如果用一个不存在的Key值进行取值的话,会返回一个null;

                Hashtable ht = new Hashtable();
                Console.WriteLine(ht["b"]==null);
                Console.ReadKey();

    捕获

      对于Dictionary而言,如果用一个不存在的Key值进行取值的话,会引发“System.Collections.Generic.KeyNotFoundException”类型的异常。

      所以在从Dictionary或者Hashtable取值时,可以先判断Key值是否存在(用ContainsKey()方法进行判断),以防止出现预期以外的值或者异常。

      第四、线程安全性

      Dictionary不是线程安全的,Hashtable是线程安全的。

    以上就是浅谈C# 之 Hashtable 与 Dictionary的代码实例的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    上一篇:详细分析 .NET Core 构成体系(图) 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• c语言中源文件编译后生成什么文件• c语言本身有没有输入输出语句• c语言中的标识符是由什么组成• c语言中关键字有多少个• c语言中case是什么意思
    1/1

    PHP中文网