简介
C# 中的泛型是一种强大的特性,允许你编写可重用的代码,而不必为不同的数据类型编写多个版本。通过泛型,你可以创建类、方法和接口,以便它们可以在编译时指定具体的数据类型。这使得代码更加灵活、类型安全,并且可以提高性能。
案例
泛型允许我们编写代码时指定类型参数,以便在运行时使用不同的实际类型。假设我们有一个简单的需求:实现一个数组的查找最大值功能。我们可以比较使用泛型前后的实现
不使用泛型
public class NonGenericMaxFinder { public int FindMaxInt(int[] array) { if (array == null || array.Length == 0) throw new ArgumentException("Array cannot be null or empty."); int max = array[0]; foreach (int num in array) { if (num > max) max = num; } return max; } public double FindMaxDouble(double[] array) { if (array == null || array.Length == 0) throw new ArgumentException("Array cannot be null or empty."); double max = array[0]; foreach (double num in array) { if (num > max) max = num; } return max; } // More methods for other types if needed... }
使用泛型
public class GenericMaxFinder<T> where T : IComparable<T> { public T FindMax(T[] array) { if (array == null || array.Length == 0) throw new ArgumentException("Array cannot be null or empty."); T max = array[0]; foreach (T item in array) { if (item.CompareTo(max) > 0) max = item; } return max; } }
在这个例子中,GenericMaxClass<T>
是一个泛型类,其中的T
是类型参数。在实例化时,您可以指定T
的具体类型。使用泛型后,我们只需要一个通用的方法来处理各种类型的数组,而不需要为每种类型编写单独的方法,这使得代码更加简洁。
泛型约束
泛型约束允许对泛型类型参数进行更严格的限制。例如,可以使用where
子句来指定类型参数必须是特定类型、必须实现特定接口或必须具有无参构造函数等。以下是一个示例:
public class GenericClass<T> where T : IComparable { // 泛型类体 }
在这个示例中,T
必须实现IComparable
接口。还可以使用where T : struct
来指定T
必须是值类型。
泛型方法
除了泛型类之外,C#还支持泛型方法。这使得可以在方法级别使用泛型。以下是一个示例:
public class GenericMethodExample { public T Max<T>(T first, T second) where T : IComparable { return first.CompareTo(second) >= 0 ? first : second; } }
在这个示例中,Max
方法是一个泛型方法,它接受两个参数并返回较大的那个。T
被约束为实现IComparable
接口的类型。
泛型委托
C#中的委托也可以是泛型的,这使得可以定义可重用的委托类型,而不必为每种类型都定义一个新的委托类型。以下是一个示例:
public delegate T Transformer<T>(T arg);
这里,Transformer<T>
是一个泛型委托,它接受一个类型为T
的参数并返回相同类型的结果。
三大特性
1. 类型安全性(Type Safety)
泛型提供了在编译时进行类型检查的机制,这意味着可以在编译时捕获类型不匹配的错误。使用泛型,可以在编写代码时指定类型参数,并且编译器会确保在使用这些参数时类型的一致性。这有助于防止在运行时出现类型转换错误或无效操作,提高了代码的可靠性和安全性。
2. 代码重用性(Code Reusability)
泛型允许编写可重用的通用代码,这意味着可以编写一次代码,然后在不同的数据类型上重复使用它。通过泛型,可以创建适用于多种类型的类、方法、接口和委托等组件,而不必针对每种类型都编写单独的代码。这样可以减少代码重复,提高了代码的可维护性和可扩展性。
3. 性能优化(Performance Optimization)
泛型在一定程度上可以提高代码的性能。由于泛型在编译时生成特定类型的代码,避免了装箱(boxing)和拆箱(unboxing)操作,从而减少了在运行时的性能开销。此外,泛型还可以减少由于类型转换和运行时类型检查而产生的额外开销。因此,泛型在某些情况下可以提高代码的执行效率。
标签:max,代码,类型,泛型,array,public From: https://www.cnblogs.com/mchao/p/18058832