设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 编程开发 >> 网站制作技术 >> C# 中的泛型
精品推荐
网站制作技术点击TOP10
·网页打印问题,打印设置,打印预览,打印分页,纵打,横打及页面的边距
·使用PHP DOM-XML创建和解析XML文件
·Asp.net可输入下拉框服务器控件
·用createPopup()方法来模似透明网页窗体
·Shake_JS选色器
·嵌入式网站媒体播放器ExoBUD MP(II) v4.1tc+
·仿QQ2003风格的导航栏
·在 Windows 系统安装虚拟网卡
·全角/半角的转换函数
·聊天室内看人家的IP
编程开发点击TOP10
·数字小键盘指法练习
·ASP.NET 程序中常用的三十三种代码
·C++经典电子书下载
·java笔试题
·Modem 常用AT指令集
·异常java.sql.SQLException: Io exception:The Network Adapter could not establish connection
·MyEclipse 下开发JSF教程
·挂钩Windows API
·MYSQL 新版出现 Client does not support authentication protocol requested by server; consider upgrading MySQL client解决办法
·.NET 初 级 读 本
精选专题

C# 中的泛型

作者: 来源: 时间:2007-8-4 11:05:48

C# 中的泛型(2) 我们可以添加一些整形值到链表中进行测试:

 

public void Run(){

    LinkedList ll = new LinkedList();

    for ( int i = 0; i < 10; i ++ ){

       ll.Add(i);

    }

 

    Console.WriteLine(ll);

    Console.WriteLine("  Done. Adding employees...");

}

 

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

 

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Done. Adding employees...

 

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

 

ll.Add(new Employee("John"));

ll.Add(new Employee("Paul"));

ll.Add(new Employee("George"));

ll.Add(new Employee("Ringo"));

 

Console.WriteLine(ll);

Console.WriteLine("  Done.");

 

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

 

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

  Done. Adding employees...

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, John, Paul, George, Ringo

  Done.

 

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

 

IL_000c:  box        [mscorlib]System.Int32

IL_0011:  callvirt   instance void ObjectLinkedList.LinkedList::Add(object)

 

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

 

Console.WriteLine("The fourth integer is " + Convert.ToInt32(ll[3]));

Employee d = (Employee) ll[11];

Console.WriteLine("The second Employee is " + d);

 

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

 

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

 

public class EmployeeNode {

    Employee employeedata;

    EmployeeNode employeeNext;

}

 

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

 

public class EmployeeLinkedList{

  EmployeeNode headNode = null;

}

 

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

 

public void Add(Employee data){

    if ( headNode == null ){

       headNode = new EmployeeNode(data);}

    else{

       headNode.Append(new EmployeeNode(data));

    }

}

 

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

 

EmployeeLinkedList employees = new EmployeeLinkedList();

employees.Add(new Employee("Stephen King"));

employees.Add(new Employee("James Joyce"));

employees.Add(new Employee("William Faulkner"));

/* employees.Add(5);  // try to add an integer - won't compile */

Console.WriteLine(employees);

Employee e = employees[1];

Console.WriteLine("The second Employee is " + e);

 

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

 

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

使用泛型来达到代码重用

共4页 9 7 [1] [2] [3] [48 :>

C# 中的泛型 相关文章:
C# 中的泛型 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com