线性链表测试方法简介

我们可以添加一些整型值到进行线性链表测试:

 
 
 
  1. public void Run(){  
  2.     LinkedList ll = new LinkedList();  
  3.     for ( int i = 0; i <  10; i ++ ){  
  4.        ll.Add(i);  
  5.     }  
  6.  
  7.     Console.WriteLine(ll);  
  8.     Console.WriteLine("  Done. Adding employees...");  
  9. }  

如果你对这段代码进行测试,它会如预计的那样工作:

 
 
 
  1. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9  
  2. Done. Adding employees... 

然而,因为这是一个Object类型的集合,所以你同样可以将Employee类型添加到集合中。

 
 
 
  1. ll.Add(new Employee("John"));  
  2. ll.Add(new Employee("Paul"));  
  3. ll.Add(new Employee("George"));  
  4. ll.Add(new Employee("Ringo"));  
  5.  
  6. Console.WriteLine(ll);  
  7. Console.WriteLine("  Done."); 

输出的结果证实了,整型值和Employee类型都被存储在了同一个集合中。

 
 
 
  1. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9  
  2.   Done. Adding employees...  
  3. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, John, Paul, George, Ringo  
  4. Done. 

虽然看上去这样很方便,但是负面影响是,你失去了所有类型安全的特性。因为线性链表需要的是一个Object类型,每一个添加到集合中的整型值都被隐式装箱了,如同 IL 代码所示:

 
 
 
  1. IL_000c:  box        [mscorlib]System.Int32  
  2. IL_0011:  callvirt   instance void ObjectLinkedList.LinkedList::Add(object) 

同样,如果上面所说,当你从你的列表中取出项目的时候,这些整型必须被显式地拆箱(强制转换成整型),Employee类型必须被强制转换成 Employee类型。

 
 
 
  1. Console.WriteLine("The fourth integer is " + Convert.ToInt32(ll[3]));  
  2. Employee d = (Employee) ll[11];  
  3. Console.WriteLine("The second Employee is " + d); 

这些问题的解决方案是创建一个类型安全的集合。一个 Employee 线性链表将不能接受 Object 类型;它只接受 Employee类的实例(或者继承自Employee类的实例)。这样将会是类型安全的,并且不再需要类型转换。一个整型的线性链表,这个链表将不再需要装箱和拆箱的操作(因为它只能接受整型值)。

作为示例,你将创建一个 EmployeeNode,该结点知道它的data的类型是Employee。

 
 
 
  1. public class EmployeeNode {  
  2.     Employee employeedata;  
  3.     EmployeeNode employeeNext;  

Append 方法现在接受一个 EmployeeNode 类型的参数。你同样需要创建一个新的 EmployeeLinkedList ,这个链表接受一个新的 EmployeeNode:

 
 
 
  1. public class EmployeeLinkedList{  
  2.     EmployeeNode headNode = null;  

EmployeeLinkedList.Add()方法不再接受一个 Object,而是接受一个Employee:

 
 
 
  1. public void Add(Employee data){  
  2.     if ( headNode == null ){  
  3.        headNode = new EmployeeNode(data);}  
  4.     else{  
  5.        headNode.Append(new EmployeeNode(data));  
  6.     }  

类似的,索引器必须被修改成接受 EmployeeNode 类型,等等。这样确实解决了装箱、拆箱的问题,并且加入了类型安全的特性。你现在可以添加Employee(但不是整型)到你新的线性链表中了,并且当你从中取出Employee的时候,不再需要类型转换了。

 
 
 
  1. EmployeeLinkedList employees = new EmployeeLinkedList();  
  2. employees.Add(new Employee("Stephen King"));  
  3. employees.Add(new Employee("James Joyce"));  
  4. employees.Add(new Employee("William Faulkner"));  
  5. /* employees.Add(5);  // try to add an integer - won't compile */ 
  6. Console.WriteLine(employees);  
  7. Employee e = employees[1];  
  8. Console.WriteLine("The second Employee is " + e); 

这样多好啊,当有一个整型试图隐式地转换到Employee类型时,代码甚至连编译器都不能通过!

但它不好的地方是:每次你需要创建一个类型安全的列表时,你都需要做很多的复制/粘贴 。一点也不够好,一点也没有代码重用。同时,如果你是这个类的作者,你甚至不能提前欲知这个链接列表所应该接受的类型是什么,所以,你不得不将添加类型安全这一机制的工作交给类的使用者---你的用户。

这样,线性链表测试就完成了。

网页名称:线性链表测试方法简介
文章路径:http://www.csdahua.cn/qtweb/news7/449957.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网