C#高级编程之泛型一(泛型的引入、泛型的使用、何为泛型)

为什么引入泛型

当咱们要对不一样类型的参数执行相似的方法时:以下所示功能打印传入参数的相关信息。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)。
可是其会存在这样的问题:函数

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

对于装箱拆箱的问题,这里就要了解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,这样就可设计具备如下特征的类和方法:在客户端代码声明并初始化这些类或方法以前,这些类或方法会延迟指定一个或多个类型。其兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法没法实现的。

总结:

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

下章归纳:

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

如何建立本身的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。

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

相关文章
相关标签/搜索