首页 > 其他分享 >泛型的学习

泛型的学习

时间:2023-03-24 13:47:07浏览次数:38  
标签:--- sw 学习 类型 static 泛型 Parameter

泛型的学习

一、泛型的引入

  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>(T parameter)
        {

        }

    }

结果为:

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

二、泛型的声明

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

标签:---,sw,学习,类型,static,泛型,Parameter
From: https://www.cnblogs.com/wenlong-4613615/p/17251136.html

相关文章

  • 【动画消消乐】纯CSS加载/过渡动画学习笔记合集(1-50)
    Hello!小伙伴!首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~自我介绍一下ଘ(੭ˊᵕˋ)੭昵称:海轰标签:程序猿一只|C++选手|学生简介:因C语言结识编程,随后转......
  • 2023.3.23学习记录
    P9:Transform的使用#P9:Transforms的使用importcv2fromtorchvisionimporttransformsfromPILimportImagefromtorch.utils.tensorboardimportSummaryWriter#python......
  • 【研究生学习】Pytorch基本知识
    本篇博客记录一下Pytorch的基本知识,同时也通过各种实例来帮助理解如何使用PytorchPytorch中的张量Pytorch中的自动求导在目前的深度学习框架中,自动求导功能是最核心也是......
  • 今日学习心得
    day02   1.package           包的理解?  文件夹           包的作用?  存放类文件的地方       ......
  • 这个是我在学习基础知识的一些照片,方便后期可以查看
                                                        ......
  • vue export学习笔记2
    #创建项目vuecreatevuecli-dem0#启动项目npmrunserve#打包项目npmrunbuild#路由说明由于Vue在开发时对路由支持的不足,于是官方补充了vue-router插件。vue的单......
  • vue export学习笔记
    export用来导出模块,Vue的单文件组件通常需要导出一个对象,这个对象是Vue实例的选项对象,以便于在其它地方可以使用import引入。export和exportdefault的区别在于:e......
  • 显卡驱动+cuda+cudnn+深度学习框架
    安装概览安装显卡驱动、CUDA和cuDNN可能因操作系统和GPU型号而异,下面是一般的步骤:下载和安装适合你GPU型号的显卡驱动,可以从官方网站或者GPU制造商的网站下载......
  • 打开CMD的方式 使用MaKDown学习
    打开CMD的方式1.开始+系统+命令提示符2.Win+R输入cmd打开控制台3.在任意文件夹下面,按住shift键+鼠标右键点击,在此处打开命令行窗口4.资源管理器的地址前面加上cmd路劲......
  • java学习日记20230322-代码块
    代码块代码块又称为初始化块,属于类中的成员,是类的一部分,类似于方法,将逻辑语句封装在方法体中,通过{}包围起来。但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不......