线性链表测试方法简介

开发 后端
本文简要介绍了一下线性链表的测试方法,希望对大家有所帮助。

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

  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类型时,代码甚至连编译器都不能通过!

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

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

【编辑推荐】

  1. C# winForm自定义鼠标样式的两种方法
  2. C#自定义消息框的设置图解
  3. 掌握C#自定义泛型类:从初始化说起
  4. C#存储过程的循序渐进
  5. 存储过程的优势及其调用方法介绍
责任编辑:book05 来源: csdn
相关推荐

2009-02-09 09:51:00

网络故障测试调试

2009-08-19 04:14:00

线性链表

2021-05-12 14:09:35

链表数据结构线性结构

2011-03-30 16:54:13

JUnit

2009-06-19 16:26:51

JUnit测试骨架

2021-01-06 05:31:13

线性表链表数据

2010-06-03 09:13:35

2010-04-13 10:49:32

2009-08-25 17:07:27

C#虚拟方法

2010-12-17 10:07:55

2009-12-14 16:44:56

Ruby调用DLL

2010-04-13 10:54:33

MPLS

2010-01-28 11:07:59

Android NDK

2010-03-10 10:55:14

2009-12-23 17:57:22

WPF默认模板

2017-08-18 14:01:44

大数据dataWrangle

2011-04-08 10:43:44

2013-05-03 11:37:16

结构化布线布线技术布线系统

2011-05-16 16:52:09

单元测试彻底测试

2018-10-21 08:14:49

点赞
收藏

51CTO技术栈公众号