热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

面试必备:聊聊开发中对C#泛型的应用?

简述:我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样。但我们没

简述:

我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样。但我们没有办法,只能分别写多个方法来处理不同的数据类型。这个时候,泛型可以用同一个方法来处理传入不同种类型参数。泛型的出现就是专门来解决这个问题的。

实际应用可以做数据层的sqlhelper类,减少代码量的实际编写。

泛型是C#2.0推出的新语法,不是语法糖,而是2.0由框架升级提供的功能。


扩展:


下面我们举例演示泛型的简单应用

  我们列出两个最基础的方法:

    ///


    /// 返回int
    ///

    ///
    ///
    public int ShowInt(int I)
    {
    return I;
    }
    ///
    /// 返回String
    ///

    ///
    ///
    public string ShowString (string I)
    {
    return I;
    }

      上面的两个方法自从参数 进来到参数出去的这一个过程中我们没有进行参数方面的转换,也就是说单纯的针对的参数类型上面我们程序代码是没有损失任何的性能的。一位没有存在拆箱装箱的过程。

      我们在看两个方法:我们使用了在C# 1.0 时代就存在的一个类型 是Object
      

      ///


      /// 返回int
      ///

      ///
      ///
      public int ShowString(object I)
      {
      return Convert.ToInt32(I);
      }
      ///
      /// 返回String
      ///

      ///
      ///
      public string ShowString(object I)
      {
      return I.ToString();
      }

         这里我们使用的阐述类型是Obj ,Object 是引用类型,也是所有类型的父类,可以包容所有的类型,但是就单说处理参数类型的时候我们需要去转换一下才能进行使用,在这个转换的过程中我们已经损失了性能,但是使用Obj 的时候我们可以和成一个方法减少代码量,提升了代码的复用率。

        比如:

        ///


        /// 返回object
        ///

        ///
        ///
        public object ShowType(object I)
        {
        return I;
        }


          现在简写成为这样后,我们是一个公用的方法:虽然说内部不用去转换了但是,在调用后,还是需要类型的转换同样的需要损失性能。中间性能之所以会损失是因为Obj是引用类型,存放在堆上的,假如说我们传的参数是int或其他的值类型来使用我们的公共方法,就会进行一次包装的过程,把存放在栈里面的值类型移动包装成为引用类型存放到堆里面,使参数符合当前方法的类型,这个过成也就是装箱(需要重新分配内存),但是我们在使用的时候,又需要把他拿出来进行一下装换转换为值类型,这个过程又称为拆箱

          我们在来使用一个方法:使用 2.0时代出现的泛型:

          ///


          /// 返回 T
          ///

          ///
          ///
          public T Show(T Parameter)
          {
          return Parameter;
          }


            为什么会使用泛型 是因为泛型方法再调用的时候有延时声明的功能这里的延时声明式只参数,泛型里面的 T ,其实咱们也可以理解为 占位符具体为谁占位的,等到调用的时候才会知道。

            如下:

          int parameter = 0;
          //在调用的时候声明参数类型
          parameter = new Common().Show<int>(parameter);
          //如果调用的时候不去声明的话,JIT编译的时候野会帮我们自动计算
          parameter = new Common().Show(parameter);

            这个时候不会损耗什么性能。延时声明也是咱们在进行框架设计的时候常用的一种思想,提高框架的性能。泛型不只是可以声明泛型方法:

            泛型类:

            ///


            /// CURD 操作类
            ///

            ///
            public class ConmonClass
            {
            public void Add(T s) { };
            public void Update(T s) { };
            public void Del(T s) { };
            public void Select(T s) { };
            }


              这样使用的话,在咱们真正的项目,我们可以把某些基础的操作用一个类去搞定,使用的时候调用就是了,减少代码的冗余,增加复用性,重用率。

              泛型接口:

              ///


              /// CURD 操作接口类
              ///

              ///
              public interface ConmonInterface<T>
              {
              T Add(T s);
              T Update(T s);
              T Del(T s);
              T Select(T s);
              }


                泛型委托:

              //泛型委托
              public delegate T GetHandler();

                我想以上的操作在我们开发项目的时候会经常见到,或使用到

                以上代码需要我们注意的时候,泛型类不能被继承,如果想要继承的话需要在继承的时候,给我们的不确定参数确定下参数类型。包括泛型接口也是一样的。

                如下:

                public class Son : ConmonClass
                {};
                ///


                /// 实现泛型接口
                ///

                public class SonInterface : ConmonInterface
                {
                public Common Add(Common s)
                {
                throw new NotImplementedException();
                }


                public Common Del(Common s)
                {
                throw new NotImplementedException();
                }


                public Common Select(Common s)
                {
                throw new NotImplementedException();
                }


                public Common Update(Common s)
                {
                throw new NotImplementedException();
                }
                }


                  如果说不指定泛型类型的参数类型式其实我们一样是可以继承的。需用继承者同样是泛型的

                  建议:长期使用Net的同学我想我们需要加强一下泛型的认识了,因为在NetCore中常常会使用依赖注入,在使用泛型类的时候我们可能会多少有点麻烦的,泛型方法相对来说要简单的,如果说要想让我们的框架实现高度的内聚,大家需要多多理解。

                  泛型的约束,多重约束相当重要,代表我们是否能很好的利用泛型。

                  泛型的约束类型大概分为如下几种:

                引用类型约束:

                表明泛型参数只能是引用类型的:

                值类型约束:

                表明泛型参数只能是值类型的:

                无参数构造函数约束:

                泛型是可以实例化的。

                基类约束

                必须满足基类中的某些属性

                接口约束

                必须满足接口中的某些属性

                引用:https://www.cnblogs.com/szlblog/p/10703770.html

                支持小微:

                腾讯云 搞活动了?玩服务器的可以搞搞。就这几天时间。

                云服务器限时秒杀,1核2G 首年95元!

                链接:https://curl.qcloud.com/RX2amrlR


                右下角,您点一下在看图片

                小微工资涨1毛

                商务合作QQ:185601686









                推荐阅读
                • 如何将Python与Excel高效结合:常用操作技巧解析
                  本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
                • javascript分页类支持页码格式
                  前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
                • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
                  在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
                • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
                  本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
                • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
                  本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
                • 如何在C#中配置组合框的背景颜色? ... [详细]
                • 如何精通编程语言:全面指南与实用技巧
                  如何精通编程语言:全面指南与实用技巧 ... [详细]
                • 使用多项式拟合分析淘宝双11销售趋势
                  根据天猫官方数据,2019年双11成交额达到2684亿元,再次刷新历史记录。本文通过多项式拟合方法,分析并预测未来几年的销售趋势。 ... [详细]
                • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
                • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
                  本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
                • 从0到1搭建大数据平台
                  从0到1搭建大数据平台 ... [详细]
                • 深入解析 Lifecycle 的实现原理
                  本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
                • R语言及RStudio的安装步骤详解
                  本文详细介绍了如何正确安装R语言及其集成开发环境RStudio。首先,需要确保安装R语言的基础环境,然后再安装RStudio。虽然先安装RStudio在技术上可行,但为了遵循最佳实践,建议先安装R语言。以下是R语言安装包的下载链接。 ... [详细]
                • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
                • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
                author-avatar
                holy190
                这个家伙很懒,什么也没留下!
                PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
                Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有