C#基础之泛型
什么是泛型
在C#中,泛型即“参数化类型”,即对数据类型进行参数化,使得能够在类型安全的前提下对不同的数据类型进行通用的操作。用一句话来概括就是,泛型即类型参数化。
泛型具有以下特点:
- 可以避免类型强转的问题。
- 提供更高效的代码复用,避免了针对不同类型创建不同版本的代码的问题。
- 增加代码可读性,因为泛型可以让我们不需要在代码中反复使用Object类型。
泛型的语法
泛型的语法如下所示:
class 类名<类型形参>
{
// 类的成员
}
其中,类型形参
用来代替实际的数据类型。
泛型类
定义泛型类的语法如下所示:
class 类名<T>
{
private T[] arr;
// 其他成员
}
其中,T
即为类型形参,代表了要使用的数据类型。
使用泛型类时,需要指定实际的数据类型,如下所示:
MyClass<int> myClass = new MyClass<int>();
上述代码中,<int>
表示将泛型类的类型形参T
替换为int
类型。
以下是一个完整的示例:
class MyGenericClass<T>
{
private T[] arr;
public MyGenericClass(int size)
{
arr = new T[size];
}
public T GetItem(int index)
{
return arr[index];
}
public void SetItem(int index, T value)
{
arr[index] = value;
}
}
class Program
{
static void Main(string[] args)
{
// 使用泛型类来创建一个int数组
MyGenericClass<int> intArr = new MyGenericClass<int>(5);
// 设置数组元素的值
intArr.SetItem(0, 1);
intArr.SetItem(1, 2);
intArr.SetItem(2, 3);
intArr.SetItem(3, 4);
intArr.SetItem(4, 5);
// 获取数组元素的值
Console.WriteLine(intArr.GetItem(0)); // 输出:1
Console.WriteLine(intArr.GetItem(1)); // 输出:2
Console.WriteLine(intArr.GetItem(2)); // 输出:3
Console.WriteLine(intArr.GetItem(3)); // 输出:4
Console.WriteLine(intArr.GetItem(4)); // 输出:5
}
}
以上代码中,MyGenericClass<T>
是一个泛型类,T
为类型形参。在Main()
方法中,使用MyGenericClass<int>
来创建一个int类型的数组,实现了对int类型数组的读写操作。
泛型方法
定义泛型方法的语法如下所示:
返回类型 函数名<类型形参>(参数列表)
{
// 函数实现
}
其中,类型形参
用来代替实际的数据类型。
例如,以下代码中的T
即为类型形参:
public static T Max<T>(T a, T b)
{
return a > b ? a : b;
}
使用泛型方法时,需要在函数名称前加上类型参数,如下所示:
int max = Max<int>(3, 5);
上述代码中,<int>
表示将类型形参T
替换为int
类型。
以下是一个完整的示例:
class Program
{
static void Main(string[] args)
{
// 使用泛型方法找到两个整数中的最大值
int max = Max<int>(3, 5);
Console.WriteLine(max); // 输出:5
// 使用泛型方法找到两个浮点数中的最大值
double max2 = Max<double>(3.14, 5.68);
Console.WriteLine(max2); // 输出:5.68
}
public static T Max<T>(T a, T b) where T : IComparable
{
return a.CompareTo(b) > 0 ? a : b;
}
}
以上代码中,Max<T>
是一个泛型方法,T
为类型形参。在主函数中,使用Max<int>
和Max<double>
分别找到了两个整数和两个浮点数中的最大值。注意,为了使用CompareTo()
方法对两个数据进行比较,需要在Max<T>
函数上增加一个类型约束where T : IComparable
。
总结
泛型是C#中十分重要的一种语言特性,能够避免类型强转的问题,提高代码的实用性和可读性。在使用泛型时,需要注意类型参数的指定和类型约束的处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基础之泛型 - Python技术站