- 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#中泛型的类型安全与性能提高
最新推荐文章于 2019-09-13 21:26:00 发布