为何引入泛型

当我们要对不同类型的参数执行类似的方法时:如下所示功能打印传入参数的相关信息。

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}");
}

这似乎能解决我们的问题,一个方法可以适用于所有类型。之所以能解决的原因是:

Object是所有类的基类; 任何父类出现的地方(Object作为函数签名的形参),都可以用子类代替[实际传入实参](里氏替换原则LSP)。
但是其会存在这样的问题:

  1. 性能问题:会出现装箱与拆箱 。此处为 int->object(装箱),object->int实际类型(拆箱);

对于装箱拆箱的问题,这里就要了解C#装箱与拆箱的内部操作和C#内存模型。

详情请移步至:

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/boxing-and-unboxing

https://blog.csdn.net/qiaoquan3/article/details/51439726

2.类型安全问题(泛型约束可解决)。如下所示:

程序编译通过,但是运行期间会抛异常,对于这种以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,这样就可设计具有以下特征的类和方法:在客户端代码声明并初始化这些类或方法之前,这些类或方法会延迟指定一个或多个类型。其兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法无法实现的。

总结:

  • 使用泛型类型可以最大限度地重用代码、保护类型安全性以及提高性能。
  • 泛型最常见的用途是创建集合类。
  • .NET 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类。 应尽可能使用这些类来代替某些类,如 System.Collections 命名空间中的 ArrayList
  • 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
  • 可以对泛型类进行约束以访问特定数据类型的方法。
  • 在泛型数据类型中所用类型的信息可在运行时通过使用反射来获取。

下章概括:

如何对泛型类以及泛型方法进行约束以范文特定数据类型。

如何创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。

如何通过反射获取泛型数据类型进行相关操作。

最新文章

  1. eclipse里打开SWT项目找不到source/design的图形UI设计界面
  2. jstl 小总结 以及 jstl fn
  3. NSSortDescriptor对象进行数组排序
  4. MLA Handbook for Writers of Research Papers笔记
  5. BulkyCopy .Net
  6. motan源码解读:注册中心zookeeper(2)
  7. [原创]Devexpress XtraReports 系列 4 创建多栏报表
  8. DEDECMS 猜你喜欢
  9. COM组件简介
  10. CentOS下成功修复了Windows的grub引导
  11. 关于《Web接口开发与自动化测试--基于Python语言》
  12. BZOJ3275Number——二分图最大权独立集
  13. Mesos初体验-Mesos优势
  14. Netty自带连接池的使用
  15. python模块安装注意事项
  16. Animator状态快速切换问题
  17. 从0开始学golang--1.1--连接ms sql server数据库
  18. D - Balanced Ternary String (贪心)
  19. 2016.5.19——vector型的输入输出
  20. Excel中使用VBA访问Access数据库

热门文章

  1. docker设置http访问
  2. 转 Swoole】用swoole简单实现MySQL连接池
  3. laravel job 队列
  4. SOAP调用Web Service
  5. dhtmlxSpreadSheet开源电子表格小部件创建教程
  6. 使用经纬度得到位置Geocorder
  7. (python)getattr等用法
  8. SQL注入的一些学习
  9. 合适的LoRa网关应该怎么选择
  10. java安全编码指南之:文件和共享目录的安全性