一、泛型是什么?
1、通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型"将类型抽象化,从而实现灵活的复用。
换句话来说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。
2、在 C# 语言中泛型方法是指通过泛型来约束方法中的参数类型,也可以理解为对数据类型设置了参数。
如果没有泛型,每次方法中的参数类型都是固定的,不能随意更改。
在使用泛型后,方法中的数据类型则有指定的泛型来约束,即可以根据提供的泛型来传递不同类型的参数。
定义泛型方法需要在方法名和参数列表之间加上<>
,并在其中使用 T
来代表参数类型。
当然,也可以使用其他的标识符来代替参数类型, 但通常都使用 T
来表示。
二、实例
【实例】创建泛型方法,实现对两个数的求和运算。
根据题目要求,代码如下。
- class Program
- {
- static void Main(string[] args)
- {
- //将T设置为double类型
- Add<double>(3.3, 4);
- //将T设置为int类型
- Add<int>(3, 4);
- }
- //加法运算
- private static void Add<T>(T a, T b)
- {
- double sum = double.Parse(a.ToString()) + double.Parse(b.ToString());
- Console.WriteLine(sum);
- }
- }
执行上面的代码,效果如下图所示。
从上面的执行效果可以看出,在调用 Add 方法时能指定不同的参数类型执行加法运算。
如果在调用 Add 方法时,没有按照 <T> 中规定的类型传递参数,则会出现编译错误,这样就可以尽量避免程序在运行时出现异常
三、泛型的特性
使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:
- 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
- 您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
- 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
- 您可以对泛型类进行约束以访问特定数据类型的方法。
- 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。
四、在声明泛型方法/泛型类的时候,可以给泛型加上一定的约束来满足我们特定的一些条件。
比如:
using System; using System.Web.Caching; namespace Demo.CacheManager { public class CacheHelper<T> where T:new() { } }
泛型限定条件:
- T:结构(类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型)
- T:类 (类型参数必须是引用类型,包括任何类、接口、委托或数组类型)
- T:new() (类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时new() 约束必须最后指定)
- T:<基类名> 类型参数必须是指定的基类或派生自指定的基类
- T:<接口名称> 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
- T:U