在定义类或方法的时候,不清楚调用者会使用那种类型的参数,则可以先定义为泛型类型,在调用的时候再指定其类型
泛型分为泛型方法和泛型类,泛型方法的定义语法如下
void 方法名<泛型列表>() { // 方法体 }
泛型类的定义语法如下
public class 类名<泛型列表> { // 类体 }
泛型列表每个参数类型用 “,” 逗号隔开。
在程序中,泛型就是一个类型,只要是在类中定义了,就可以像使用普通类型一样使用
static void Method1<T>(T str) { Console.WriteLine("Method1:" + str); }
Method1<string>("123"); --> 123 Method1<int>(12345); --> 12345 Method1<bool>(false); --> false Method1<bool>(1==1); --> true
根据调用者指定的类型不同,可以使用不同的参数,如果指定了string类型,但是参数不带“”双引号,就会报错
使用泛型类与使用泛型方法一致
public class Class1<T>{ public void Method1(T str) { Console.WriteLine("参数为:" + str); } }
Class1<string> c = new Class1<string>(); c.Method1("fsa"); --> fsa Class1<int> c1 = new Class1<int>(); c1.Method1(123); --> 123
因为在类中声明了泛型所以方法中可以直接使用
泛型也可以指定条件,比如这个类型只可以是stirng或者int这两个其中一个,其他类型不可以
指定条件语法如下
void 方法名<泛型列表>() where 泛型参数 : int,class之类的类型
{
// 方法体
}
泛型类的定义语法如下
public class 类名<泛型列表>where 泛型参数 : int,class之类的类型
{
// 类体
}
具体条件可以参考下面的表格
约束 | 描述 |
---|---|
where T: struct |
类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。 有关详细信息,请参阅使用可以为 null 的类型。 |
where T : class |
类型参数必须是引用类型;这同样适用于所有类、接口、委托或数组类型。 |
where T : new() |
类型参数必须具有公共无参数构造函数。 与其他约束一起使用时,new() 约束必须最后指定。 |
where T : <基类名> |
类型参数必须是指定的基类或派生自指定的基类。 |
where T : <接口名称> |
类型参数必须是指定的接口或实现指定的接口。 可指定多个接口约束。 约束接口也可以是泛型。 |
where T : U |
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。 |