泛型的学习

日期:2022-02-07 16:32:10  来源:博客园


(资料图)

泛型的学习

一、泛型的引入

  1. 泛型---泛:宽泛的--不确定的; 型:类型---不确定的类型
  2. 无处不在的
  3. 调用普通方法的时候,参数类型在声明的时候就确定了,调用按照类型传递参数即可a. 如果有100个类型---100个方法?--很累b. 有没有能够做一个方法可以能够满足不同类型的需求呢?

传统方法

public static   class CommonMethod    {        public static void ShowInt(int Parameter)        {            Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");        }        public static void ShowString(string Parameter)        {            Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");        }        public static void ShowDateTime(DateTime Parameter)        {            Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");        }         }
  1. Object类型作为参数 ----可以传递不同的参数a. 任何子类出现的地址都可以让父类来代替b. 万物皆对象---任何一个类型都是继承自Object

使用Object类型

public static   class CommonMethod    {        public static void ShowObject(object Parameter)        {            Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");        }    }
  1. 问题a. 性能问题 ---装箱拆箱---在c#语法中,按照声明时决定类型的(栈、托管堆)b. 类型安全问题

我们通过一个例子来体现性能的问题

public  class PerformanceTest    {        public static void Show()        {            int ivalue = 1234;            //消耗的时间            long commonSecond = 0;            long objectSecond = 0;            long genericSecond = 0;            {                Stopwatch sw = new Stopwatch();                 sw.Start();                for (int i = 0; i < 1000_000_000; i++) {                    ShowInt(ivalue);                }               sw.Stop();                commonSecond = sw.ElapsedMilliseconds;            }            {                Stopwatch sw = new Stopwatch();                sw.Start();                for (int i = 0; i < 1000_000_000; i++)                {                    ShowObject(ivalue);                }                sw.Stop();                objectSecond = sw.ElapsedMilliseconds;            }            {                Stopwatch sw = new Stopwatch();                sw.Start();                for (int i = 0; i < 1000_000_000; i++)                {                    Show(ivalue);                }                sw.Stop();                genericSecond = sw.ElapsedMilliseconds;            }            Console.WriteLine($"commonSecond: {commonSecond} objectSecond: {objectSecond} genericSecond :{genericSecond} ");        }                private static void ShowInt(int r)        {        }        private static void ShowObject(object o)        {        }         private static void Show(T parameter)        {        }    }

结果为:

  1. 有没有既性能好,也能够支持多种类型的方法呢?---泛型方法a. 声明多了一对尖括号 + 占位符Tb. 调用--也需要多一对尖括号,尖括号中指定的类型要和传递的参数的类型一致。c. 如果可以参数推到出类型---尖括号可以省略。
  2. 泛型方法---做到了性能高---可以一个方法满足不同类的需求:---又让马儿跑,又让马吃草

二、泛型的声明

1.泛型方法:在方法名称后面多一对尖括号,尖括号中有占位符2.延迟声明:声明的时候,只是给一个占位符T,T是什么类型?不知道什么类型---调用的时候,指定你是什么,调用的时候,你说什么就是什么;3.占位符: T ---类型参数 --- 类型变量4.类型参数当作方法的参数的时候,明确参数类型。

标签: