C#为什么支持泛型Generics
Generics 泛型想必不少人用过听过,为什么很多编程语言像JAVA,c#都支持这一特性?原因有三
性能 Performance
在使用集合时,使用非Generics的集合可能导致装箱boxing 和拆箱unboxing,无疑影响了代码速度,比如下面:
var mylist = new ArrayList();//
mylist.Add(44); //值类型44转为引用类型object,引发装箱
int i1 = (int)mylist[0]; // 引用类型转为值类型引发拆箱
foreach (int i2 in mylist)//引用类型转为值类型引发拆箱
{
Console.WriteLine(i2);
}
C#支持值类型和引用类型互相转换,转换过程称为装箱boxing 和拆箱unboxing。而Generics集合就不一样了
List<int> mylist=new List<int>();//已经限定类型为int
mylist.Add(44); //没有类型转换
int i1 = mylist[0];//没有类型转换
foreach (int i2 in mylist)//没有类型转换
{
Console.WriteLine(i2);
}
类型安全Type Safety
非Generics集合容易在引起runtime异常,而编译器不会语法报错,代码如下。
var mylist=new ArrayList();
mylist.Add(44);
mylist.Add("Generics");//这里编译器不会报错
foreach (int i in mylist)
{
Console.WriteLine(i);//抛出异常
}
Generics集合就不一样了
var mylist=new list<int>();
mylist.Add(44);
mylist.Add("Generics");//这里编译器会报错
底层代码重用Binary code reuse
一次定义多次重用,无论值类型或引用类型均被generics type T 兼容,当generic类的T类型实例化为值类型比如int,它的默认值是0,而实例化为引用类型,则为null。
public class MyList<T>
{
ArrayList arrayList=new ArrayList();
public MyList()
{
}
public bool Add(T element)
{
try
{
arrayList.Add(element);
return true;
}
catch
{
return false;
}
}
public T getData(int x)
{
T data=default; //值类型默认值为0 引用类型默认值为null
data =(T)arrayList[x];
return data;
}
}
class Program
{
static void Main(string[] args)
{
MyList<int> intList=new MyList<int>();
MyList<string> strList=new MyList<string>();
}
}