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>();

        }   
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值