在C#语言中泛型方法是指通过泛型来约束方法中的参数类型,也可以理解为对数据类型设置了参数。
如果没有泛型,每次方法中的参数类型都是固定的,不能随意更改。
在使用泛型后,方法中的数据类型则有指定的泛型来约束,既可以根基提供的泛型来传递不同类型的参数。
泛型向 .NET 引入了类型参数的概念。 泛型支持设计类和方法,你可在在代码中使用该类或方法时,再定义一个或多个类型参数的规范。 例如,通过使用泛型类型参数 T
,可以编写其他客户端代码能够使用的单个类,而不会产生运行时转换或装箱操作的成本或风险,如下所示:
// Declare the generic class.
public class GenericList<T>
{
public void Add(T item) { }
}
public class ExampleClass { }
class TestGenericList
{
static void Main()
{
// Create a list of type int.
GenericList<int> list1 = new();
list1.Add(1);
// Create a list of type string.
GenericList<string> list2 = new();
list2.Add("");
// Create a list of type ExampleClass.
GenericList<ExampleClass> list3 = new();
list3.Add(new ExampleClass());
}
}
泛型方法的定义:
定义泛型方法需要在方法名和参数列表之间加上 <> ,并在其中使用 T 来代表参数类型。
当然,也可以使用其他的标识符俩代替参数类型,但通常都是用 T 来表示。下面通过实例来演示泛型方法的使用。
定义泛型方法代码比如:
public static void Add1<T>(T a)
{
Console.WriteLine("张伟" + a);
}
如何调用:
Add1<int>(202072);
Add1<string>("最帅");
Add1<string[]>(new string[] { "张伟", "张伟" });
调用泛型方法格式:<类型>(参数必须是 <> 的类型)
参数多个泛型的时候,如果都是 T ,必须保证参数是同一个类型的
public static void Add2<T>(T a, T b)
{
Console.WriteLine(a + ":" + b);
}
调用
Add2(120, 110);
Add2("张伟", "最帅");
(注意:调用泛型方法的时候方法名后面的尖括号是需要加的,虽然没加上也没事,但最好还是加上)
// 演示参数是多个不同的泛型类型参数
public static void Add3<T1, T2>(T1 a, T2 b)
{
Console.WriteLine(a + ":" + b);
}
定义一个泛型方法有几个要求:
-
在方法名后面加上 <T>
-
参数是泛型的时候,在参数前面添加 T 必须保证参数是同一个类型
泛型方法是通过类型参数声明的方法,如下所示:
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
如下示例演示使用类型参数的 int
调用方法的一种方式:
public static void TestSwap()
{
int a = 1;
int b = 2;
Swap<int>(ref a, ref b);
System.Console.WriteLine(a + " " + b);
}
类型推理的相同规则适用于静态方法和实例方法。编译器可基于传入的方法参数推断类型参数;而无法仅根据约束货返回值推断类型参数。因此,类型推理不适用于不具有参数的方法。类型推理发生在编译时,之后编译器尝试解锁重载的方法签名。 编译器将类型推理逻辑应用于共用同一名称的所有泛型方法。 在重载解决方案步骤中,编译器仅包含在其上类型推理成功的泛型方法。
在泛型类中,非泛型方法可访问类级别类型参数,如下所示:
class SampleClass<T>
{
void Swap(ref T lhs, ref T rhs) { }
}