日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
線性鏈表測試方法簡介

我們可以添加一些整型值到進(jìn)行線性鏈表測試:

 
 
 
  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. }  

如果你對這段代碼進(jìn)行測試,它會(huì)如預(yù)計(jì)的那樣工作:

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

然而,因?yàn)檫@是一個(gè)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."); 

輸出的結(jié)果證實(shí)了,整型值和Employee類型都被存儲(chǔ)在了同一個(gè)集合中。

 
 
 
  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. 

雖然看上去這樣很方便,但是負(fù)面影響是,你失去了所有類型安全的特性。因?yàn)榫€性鏈表需要的是一個(gè)Object類型,每一個(gè)添加到集合中的整型值都被隱式裝箱了,如同 IL 代碼所示:

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

同樣,如果上面所說,當(dāng)你從你的列表中取出項(xiàng)目的時(shí)候,這些整型必須被顯式地拆箱(強(qiáng)制轉(zhuǎn)換成整型),Employee類型必須被強(qiáng)制轉(zhuǎn)換成 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); 

這些問題的解決方案是創(chuàng)建一個(gè)類型安全的集合。一個(gè) Employee 線性鏈表將不能接受 Object 類型;它只接受 Employee類的實(shí)例(或者繼承自Employee類的實(shí)例)。這樣將會(huì)是類型安全的,并且不再需要類型轉(zhuǎn)換。一個(gè)整型的線性鏈表,這個(gè)鏈表將不再需要裝箱和拆箱的操作(因?yàn)樗荒芙邮苷椭?。

作為示例,你將創(chuàng)建一個(gè) EmployeeNode,該結(jié)點(diǎn)知道它的data的類型是Employee。

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

Append 方法現(xiàn)在接受一個(gè) EmployeeNode 類型的參數(shù)。你同樣需要?jiǎng)?chuàng)建一個(gè)新的 EmployeeLinkedList ,這個(gè)鏈表接受一個(gè)新的 EmployeeNode:

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

EmployeeLinkedList.Add()方法不再接受一個(gè) Object,而是接受一個(gè)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 類型,等等。這樣確實(shí)解決了裝箱、拆箱的問題,并且加入了類型安全的特性。你現(xiàn)在可以添加Employee(但不是整型)到你新的線性鏈表中了,并且當(dāng)你從中取出Employee的時(shí)候,不再需要類型轉(zhuǎn)換了。

 
 
 
  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); 

這樣多好啊,當(dāng)有一個(gè)整型試圖隱式地轉(zhuǎn)換到Employee類型時(shí),代碼甚至連編譯器都不能通過!

但它不好的地方是:每次你需要?jiǎng)?chuàng)建一個(gè)類型安全的列表時(shí),你都需要做很多的復(fù)制/粘貼 。一點(diǎn)也不夠好,一點(diǎn)也沒有代碼重用。同時(shí),如果你是這個(gè)類的作者,你甚至不能提前欲知這個(gè)鏈接列表所應(yīng)該接受的類型是什么,所以,你不得不將添加類型安全這一機(jī)制的工作交給類的使用者---你的用戶。

這樣,線性鏈表測試就完成了。


新聞標(biāo)題:線性鏈表測試方法簡介
網(wǎng)站路徑:http://www.dlmjj.cn/article/djcdscd.html