定义
初级篇教学,前几篇文章有讲到集合,就是存储多个不同数据类型的集合。由此延伸出了泛型。泛型有两个特点。
1:用来约定数据集合中的数据类型,你可以理解为模板。比如游戏机厅的游戏机,玩的时候要投入游戏币,投其他的形状相似的货币不行。编程中的泛型就是在定义时就约定了数据集合的类型。好处是存取方便,你明确的知道该集合中存储的什么类型的数据,不需要做数据类型的转换了。
2:泛型也是一种数据类型。"泛"指的是广义上的概念,"泛型"即是指广义上的数据类型。泛型具体是什么类型,取决于定义它时,设定的类型。
命名空间
之前的多线程篇忘记讲线程的命名空间了,是我的失误!。这里补
using System.Threading;
回到泛型。泛型关联的集合类的命名空间:
using System.Collections.Generic;
泛型相关的命名空间,在项目中,一般都是自动引用的。不需要你再去额外写命名空间。
下图是一个4.7.2版本的控制台程序默认引用的命名空间。
语法
List<T> list = new List<T>();
List<T>,这里使用了一个新的符号,尖括号"<>",里面有个T,这个T其实就是代指泛型对应的数据类型,这个类型在实际项目开发中,一般是一个我们自定义的类。例如:
public class User
{
}
List<User> list = new List<User>();
这里就是我定义了一个User类,然后指定集合List的数据类型为User
初级篇集合中,我们讲了ArrayList,今天讲List<T>。两者之间的相同点是都支持对集合数据的增加、删除、获取。不同点是,ArrayList可以存储任何数据类型,List<T>则限定了数据类型。ArrayList在获取元素以后,需要进行数据转换,因为ArrayList中可能存储任何类型。List<T>中获取元素则不需要类型转换,因为限定了指定的数据类型。
例子
我们定义一个用户类,包含名称和年龄,并使用泛型集合存储他们。
首先我们定义一个用户类(User),其中包含姓名(Name)和年龄(Age),并有一个用来初始化的构造函数。代码如下:
public class User
{
private string _name;
private int _age;
public string Name
{
get { return _name; }
set { _name = value; }
}
public int Age
{
get { return _age; }
set { _age = value; }
}
public User(string name,int age)
{
Name = name;
Age = age;
}
}
然后我们使用泛型集合,来定义多个用户,并且存储他们。
static void Main(string[] args)
{
List<User> list = new List<User>();
User user1 = new User("马云", 31);
User user3 = new User("马冬梅", 22);
User user2 = new User("马化腾", 25);
list.Add(user1);
list.Add(user2);
list.Add(user3);
for (int i = 0; i < list.Count; i++) {
Console.WriteLine(list[i].Name + "年龄:" + list[i].Age);
}
Console.ReadKey();
}
可以看到,我定义了一个List<T>,并且指定数据类型为User.
然后实例化了三个User对象。
使用list.Add()方法,将元素添加到泛型集合中。
然后使用一个for循环,循环输出了List中的所有元素。
可以发现的是,我在使用下标访问list中的集合时,没有使用任何数据类型转换,直接可以访问对应成员的属性。这就是泛型的优点,在使用时,不需要对其成员进行数据转换。