例1,C#泛型与非泛型性能比较
值类型的泛型与非泛型的性能比较,方法执行10次,由此可见
使用泛型要比非泛型的效率高很多。
例2,c#泛型类型安全与性能提高的实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace 泛型
{
class Program
{
static void Main(string[] args)
{
// 泛型解决的问题:
//一 避免拆箱与装箱
//例: 在写一个方法时如果有这样的需求,传一个参数,这个参数可以是int或者string,或者其他的自定义的对象,或者结构,这时有两种做法,1分别写2个方法做重载,2用object做参数。。
//1分别写2个方法做重载,增加了代码量,而且方法内好多代码是相同的,不推荐
//2用object做参数。。 这样必定在方法体内有大量的装箱拆箱,类型转换,影响性能,不推荐
//例:非泛型ArrayList
ArrayList arr = new ArrayList();
arr.Add(100);
//public virtual int Add(object value); 我们看add方法的定义,是以object value做参数的
//所以在Add传入值类型(100)时,必然会产生隐式装箱
//然后我们在读取值时:必须这样写
int value = (int)arr[0]; //在此处,为了读取出我们的值类型数据,又出现了拆箱操作。
Console.WriteLine( value );
//以上操作频繁拆箱装箱,不推荐 !
//下面演示一下泛型集合类的操作
List<int> list = new List<int>();
list.Add(100);
int value2 = list[0];
Console.WriteLine( value2 );
//以上操作中,泛型定义为int,是在JIT编译器动态生成类中使用,不会产生装箱与拆箱操作。
//二,类型安全
//如果没有泛型,我们之前的ArrayList中是用object做参数,那么就是说,可以添加int也可以是string
ArrayList arr3 = new ArrayList();
arr3.Add(100);
arr3.Add( "100");
//以上代码是不会在编译时报错的
//然后我们跌代输出
foreach (int i in arr3)
{
Console.WriteLine(i);
}
//运行时出错了,呵呵,到底是按int处理,还是string谁知道?
//虽然我们可以手动避免这种问题,我add时注意不就行了吗?
//但这样是类型不安全的,泛型做了一种强制安全
List<int> list2 = new List<int>();
list2.Add(100);
//list2.Add("100"); //编译时报错
Console.ReadLine();
}
}
}
对c#拆装箱的性能分析(泛型)
c#中,数据类型主要分为2种,分别为值类型和引用类型。把值类型转换为引用类型称为装箱,把引用类型转换为值类型称为拆箱。在c#中,值类型是在堆栈上分配内存的,而引用类型是在堆上分配内存的。装箱的时候,CLR会为堆上的对象创建一个临时的引用类型“box”。