我们首先看个例子,比如写一个方法来获取参数的类型,实现如下:
public static void ShowType(string s)
{
Console.WriteLine(s.GetType());
}
static void Main(string[] args)
{
ShowType("name");
Console.ReadKey();
}
运行结果:System.String
当然是没问题,如果传入参数是int类型呢,我们可以复制一遍然后将string改成int,那如果有未知的类型那该怎么办,哪怕是想复制粘贴也不行。
这时候稍微懂点的人就说可以用object类型,我们试一下:
public static void ShowType(Object O)
{
Console.WriteLine(O.GetType());
}
static void Main(string[] args)
{
ShowType("name");
ShowType(10);
ShowType('a');
Console.ReadKey();
}
运行结果:System.String
System.Int32
System.Char
我们看到程序可以很好的运行,并且可以通用,但是我们要知道object类型并不像表面看起来那么好用,其实它是非常“累”的。首先要帮你把类型装进箱子里(object),然后到了目的地还要帮你拆箱子,这一装一拆就耗费大量的“人力”资源,所有我们除了在万不得已的情况下还是少用万能类型object吧。
之前看到一个程序员的八荣八耻,其中有一条“以代码重用为荣,以复制粘贴为耻”,秉承着这优良传统,我们学习一下新内容:泛型。
泛型
泛型为.NET框架引入了一个叫做type parameters(类型参数)的概念,使得程序在设计的时候,不必设计其具体的参数,而是延迟到需要的时候声明或者调用。同时使用泛型也能避免类型转换的装箱和拆箱操作。
我们可以尝试一下:
public static void ShowType<T>(T t)
{
Console.WriteLine(t.GetType());
}
static void Main(string[] args)
{
ShowType<string>("name");//这里会提示string可省略
ShowType(10);
ShowType('a');
ShowType('8');
Console.ReadKey();
}
运行结果:System.String
System.Int32
System.Char
System.Char
泛型可以使得类和方法延迟指定一个或多个数据类型,并且在代码声明以及初始化时前,通过使用泛型类型参数T来编写客户端代码所需的类型。简单的来说,泛型允许你编写一个可以与任何数据类型一起工作的类或方法。
泛型类和泛型方法兼具可重用性、类型安全性和效率。
class Program
{
static void Main(string[] args)
{
Code<int> code = new Code<int>();
code.Add(1);
Code<string> code1 = new Code<string>();
code1.Add("A");
Console.WriteLine(code);
Console.WriteLine(code1);
Console.ReadKey();
}
}
public class Code<T>
{
public void Add(T input)
{
}
}