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();
关于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的代码实例的细致内容,更多请关注ki4网别的相干文章!