C# 泛型理解

匿名 (未验证) 提交于 2019-12-03 00:22:01

泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个非常重要的新功能。在此之前进行数据转化时候需要进行装箱与拆箱操作。我们知道装箱与拆箱需要消耗很大性能,泛型的引用主要优点是性能。

在学习泛型之前我们先了解一下值类型,引用类型以及装箱,拆箱。

值类型存储在栈上,引用类型存储在堆上。C#的类是引用类型,结构是值类型。.NET很容易把值类型转换成引用类型,例如int类型的值可以任意赋值给一个对象,反之,任意一个装箱后的值类型可以进行转换成引用类型,这个过程我们称之为拆箱操作,拆箱时,需要进行类型的强制转换。

下面我们拿ArrayList为例来说明一下拆箱与装箱:

static void Main(string[] args)         {             ArrayList list = new ArrayList();             //ArrayList.Add(object value)方法,可以看出传入的参数为object类型             list.Add(10);//这里传入int类型10,则进行装箱操作             //如果这时候我们想获取这个int类型             //int value = list[0];//如果这里不做强转则会报出异常:无法将类型“object”转成“int”,需要进行强转。这里也可以看出int类型存入list后进行了装箱操作             int value = (int)list[0]; //如果需要读取list保存的原来的int值,则需要进行拆箱操作         }

后来C#加入了泛型T,如下:

System.Collections.Generic名称空间中的List<T>类不使用对象,而是在使用时定义类型。实例如下:

 class Program     {         static void Main(string[] args)         {             List<int> list1 = new List<int>();             List<string> list2 = new List<string>();             List<Student> list3 = new List<Student>();             list1.Add(1);             list1.Add(2);             list1.Add(3);             foreach(int i in list1)             {                 Console.WriteLine(i);             }             list2.Add("Hello");             list2.Add("Word");             list2.Add("!");             string str = string.Empty;             foreach (string item in list2)             {                 str += item + " ";             }             Console.WriteLine(str);              Student std1=new Student();             std1.Id=1;             std1.Name="张三";             list3.Add(std1);              Student std2 = new Student();             std2.Id = 2;             std2.Name = "李四";             list3.Add(std2);              Student std3 = new Student();             std3.Id = 3;             std3.Name = "王五";             list3.Add(std3);             foreach (Student item in list3)             {                 Console.WriteLine("学号:{0};姓名:{1}", item.Id,item.Name);             }              Console.ReadLine();         }             }     public struct Student     {         public int Id { get; set; }         public string Name { get; set; }     }

泛型使用的时候指定类型即可避免了装箱拆箱的操作,大大增加了性能。


文章来源: C# 泛型理解
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!