C# 高级编程个人笔记搬运 六(泛型)

泛型的概述:

泛型的诞生意味着我们可以创建独立于被包含类型的类和方法。我们不必给不同的类型编写功能相同的许多方法和类,只创建一个方法或类即可(比方说你不必为不同类型的参数分别去写一个功能一样,但是参数类型不一样的方法)。这时候,你就会说,那么我使用Object类,也可以实现啊。但使用派生自Object类的类型进行传递不是类型安全的非类型安全是要强制转换成接受方的类型)。泛型类使用泛型类型,你大概知道下就好,我们接下来整大块详细讲)。

泛型类使用泛型类型,并可以根据需要用特定的类型替换泛型类型。这就保证了类型安全。如:

// 这是一段伪代码,比如c1是泛型类型,它并不是int类型。
// 但是当一个int类型传给c1接收的后,c1再赋值给int i,它就不需要强制转换
// 这就是类型安全的体现
int num = c1;

// 这是一段伪代码,比如c2是Object类型,它也并不是int类型。
// 但是当一个int类型传给c2接收的后,c2再赋值给int i,它需要强制转换,即加上:(int)
// 这就是非类型安全的体现
int num = (int)c2;

// 总结:
泛型:    String result = doSomeThing("参数是String");
object型:String result = (String)doSomeThing("参数是String");
泛型不再需要强制转换,编译时自动检查类型安全,避免隐性的类型转换异常;

我们常常可以看到泛型类,其实泛型它还可以用于接口和方法,还有用于委托的泛型。在c#里面,泛型不仅仅是一种数据结构,而且是CLR定义的。所以即使C#定义了泛型,也可以在在Visual Basic中用一个特定的类型实例化该泛型。

泛型可以从如下这么几点去分析它的优劣点:

①、性能;②、类型安全;③、二进制代码的重用;④、代码的拓展;⑤、命名约定

挨个来分析,首先是——“性能”,泛型的一个主要优点就是性能了:

先看下非泛型的性能损耗情况——对值类型使用非泛型集合类(即object,泛型集合是在System.Collections.Generic命名空间中的,而非泛型类是在System.Collections中的),在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装修和拆箱操作。例如int(值类型)可以赋予一个对象(引用类型),这叫做装箱。如果方法需要把一个对象作为参数,同时传递一个值类型,装箱操作就会自动进行。另一方面,装箱的值类型可以使用拆箱操作转换为值类型。在拆箱时,需要使用类型强制转换运算符(int)。

用一个非泛型集合类ArrayList类来进一步解释性能,我们上面也说了非泛型集合类是有装箱和拆箱操作的。我们ArrayList存储对象,Add()方法定义为需要把一个对象作为参数(即public void Add(对象)),所以当Add(int num)时要装箱一个整型类型。在读取ArrayList中的值时,我们又要进行拆箱操作,把对象还原为原本原本的值类型int。通过强制转换运算符把ArrayList的值赋给一个int 变量。如:

var list = new ArrayList();

// 装箱操作
list.Add(44);

// 先拆箱,再通过强制转换运算符转换成接收方的类型,赋值给变量il
int il = (int)list[0]

虽然装箱和拆箱很容易使用,但是性能损失比较大,如果是遍历许多项时更大,如:

foreach(int i in list)
{
    // 遍历一个ArrayList时,随着list越大,损耗的性能越大
}

再对比下泛使用型类的性能损耗情况——我们也用List,对于泛型类而言,用的就

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值