2020年11月13日星期五

C#高级编程之泛型的引入

1.为何引入泛型

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

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实际类型(拆箱);
  2. 类型安全问题:???(泛型约束)。

对于装箱拆箱的问题,这里就要了解C#装箱与拆箱的内部操作和C#内存模型。请移步自此处:https://blog.csdn.net/qiaoquan3/article/details/51439726。

关于泛型约束的问题,明天再写。。。。

那泛型到底怎么使用呢---->

2、泛型的使用:

如下所示为泛型方法的使用:

/// <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)  {   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();//性能测试   for (int i = 0; i < 10; i++)   {    PerformanceTest.Run();   }  } }

 

 

 

原文转载:http://www.shaoqun.com/a/490049.html

上海跨境通:https://www.ikjzd.com/w/1329

epc:https://www.ikjzd.com/w/488

斑马物联:https://www.ikjzd.com/w/1316


1.为何引入泛型当我们要对不同类型的参数执行类似的方法时:如下所示功能打印传入参数的相关信息。classCommonMethdod{///<summary>///showint///</summary>publicstaticvoidShowParam(intiParam){Console.WriteLine($"thisis{typeof(CommonMethd
naning9韩国官网:naning9韩国官网
粉丝通:粉丝通
2020黑五网一在即!船长BI带你解锁旺季制胜大招:2020黑五网一在即!船长BI带你解锁旺季制胜大招
沙头角口岸坐什么车去大鹏所城?:沙头角口岸坐什么车去大鹏所城?
北爱尔兰有什么景点:北爱尔兰有什么景点

没有评论:

发表评论