当咱们要对不一样类型的参数执行相似的方法时:以下所示功能打印传入参数的相关信息。api
class CommonMethdod { /// <summary> /// show int /// </summary> public static void ShowParam(int iParam) { Console.WriteLine($"this is {typeof(CommonMethdod)},type={iParam.GetType().Name},param={iParam}"); } public static void ShowParam(string sParam) { Console.WriteLine($"this is {typeof(CommonMethdod)},type={sParam.GetType().Name},param={sParam}"); }
}
只是参数的不一样,函数体以及函数名称都相同,很快咱们想到了一种替代方案:将函数形参改成Object。安全
public static void ShowParam(object oParam)//函数声明oParam为object,可是实参为其子类-->LSP。 { Console.WriteLine($"this is {typeof(CommonMethdod)},type={oParam.GetType().Name},param={oParam}"); }
这彷佛能解决咱们的问题,一个方法能够适用于全部类型。之因此能解决的缘由是:ide
Object是全部类的基类; 任何父类出现的地方(Object做为函数签名的形参),均可以用子类代替[实际传入实参](里氏替换原则LSP)。
可是其会存在这样的问题:函数
对于装箱拆箱的问题,这里就要了解C#装箱与拆箱的内部操做和C#内存模型。性能
详情请移步至:ui
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/boxing-and-unboxingthis
https://blog.csdn.net/qiaoquan3/article/details/51439726spa
2.类型安全问题(泛型约束可解决)。以下所示:.net
程序编译经过,可是运行期间会抛异常,对于这种以Object做为基类来进行装箱拆箱的操做存在类型安全隐患。那在C#2.0泛型提出来后就很好的解决了这两个问题。设计
关于泛型约束的问题,明天再写。。。。
那泛型到底怎么使用呢?
以下所示为泛型方法的使用:
/// <summary> /// 泛型方法代替上一个Object方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParam"></param> public static void ShowParam<T>(T tParam) { Console.WriteLine($"this is {typeof(T)},type={tParam.GetType().Name},param={tParam}"); }
咱们在客户端调用,代码以下:
class Program { static void Main(string[] args) {
Console.WriteLine("***********************Common********************"); CommonMethdod.ShowParam(1); CommonMethdod.ShowParam("abc"); Console.WriteLine("***********************Object********************"); object obj = 3.1415926; CommonMethdod.ShowParam(obj); Console.WriteLine("***********************Generic********************"); string str = "efg"; int intVal = 0; CommonMethdod.ShowParam<string>(str); CommonMethdod.ShowParam<int>(intVal); Console.ReadKey(); } }
结果以下:
泛型将类型参数的概念引入 .NET,这样就可设计具备如下特征的类和方法:在客户端代码声明并初始化这些类或方法以前,这些类或方法会延迟指定一个或多个类型。其兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法没法实现的。
下章归纳:
如何对泛型类以及泛型方法进行约束以范文特定数据类型。
如何建立本身的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
如何经过反射获取泛型数据类型进行相关操做。