C#泛型的初步理解

一.先让我们认识一下泛型。

1.1什么是泛型?

1.1.1泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

—百度百科

1.1.2上面是比较官方的解释,下面说说我得理解吧,泛型其实是一种为了减少我们代码量而引入的一种模板,在这个模板中主要封装一些特殊的算法,让我们可以在处理一些不同类型的数据但对数据的处理具有相同的逻辑算法时,只需要写出一个模板,就可以处理多种数据类型的方法,无需为每种类型都写一个处理方法

 1.2在c#中的常用泛型

           1.2.1在c#中我们可以定义泛型类,泛型接口,泛型方法,泛型委托 。。。在这里我就不一 一列举了

a. 泛型类的定义格式

修饰符 class 类名<T,U,.....>{    类成员    }

例:

    //简单的泛型类
    public class MyClassTemplate<T, U>where T:struct
    {
        private T t1;

        public T T1
        {
            get { return t1; }
            set { t1 = value; }
        }
        private U u1;

        public U U1
        {
            get { return u1; }
            set { u1 = value; }
        }
        //构造函数
        public MyClassTemplate(T t1,U u1)
        {
            this.t1 = t1;
            this.u1 = u1;
        }
        public void Print()
        {
            Console.WriteLine(t1);
        }
    }

b.泛型接口的定义格式

修饰符 interface 接口名<T,U....>{     声明     }

    //泛型接口
    interface MyInterfaceTemplate<T,U>
    {
        void PrintTU(T t1, U u1);
    }

c.泛型方法的定义格式

修饰符 返回类型  方法名<T,U....>(参数列表){     函数体    }

    //简单的泛型函数
    public class Myfun
    {
        //泛型函数
         public static  void TempleteFun<T, C>( T x,  C y)
        {
            T t1 = x;
            C c1 = y;
            Console.WriteLine(t1);
            Console.WriteLine(c1);
        }

     }

PS:<>里面代表的是泛型中可被代替的数据类型 。

二.为什么使用泛型

   使用泛型行的最大好处就是代码重用,合理的使用泛型可以大大的解决我们编写代码的数量,同时也可以提高我们的程序性能

下面我通过一个简单的例子讲解

现在我们需要一个处理两个数据类型,int 类型和String的数据,他们都需要用到栈的操作,当我没没有泛型的时候需要写出两个栈

的数据结构

2.1 处理int类型

public class Stack

    {

        private int[] m_item;

        public int Pop(){...}

        public void Push(int item){...}

        public Stack(int i)

        {

            this.m_item = new int[i];

        }

}

2.2处理字符串类型

public class Stack

    {

        private string[] m_item;

        public string Pop(){...}

        public void Push(string item){...}

        public Stack(int i)

        {

            this.m_item = new string[i];

        }

}

2.3当然我们也可以用object代替int 和string类型的

public class Stack

    {

        private object[] m_item;

        public object Pop(){...}

        public void Push(object item){...}

        public Stack(int i)

        {

            this.m_item = new[i];

        }

    }

2.4上面这个栈可以处理任何数据类型的数据,应为object是所有类的基类。虽然这样写可以处理各种数据类型,但在其中存在这拆箱和装箱,如果数据太多会影响到程序的性能,
因此在c#2.0的时候泛型就此诞生了,他借鉴C++的模板为我们提供了泛型,在使用泛型的时候程序会在编译阶段根据我们提供的类型生成相应的二进制代码,无须进行装箱和拆箱

因此在上面的代码中我们可以使用泛型解决代码如下,这样我们也可以对于任何数据类型都可以使用这个栈了

public class Stack<T>

    {

        private T[] m_item;

        public T Pop(){...}

        public void Push(T item){...}

        public Stack(int i)

        {

            this.m_item = new T[i];

        }

}
时间: 2024-10-28 15:44:45

C#泛型的初步理解的相关文章

对于中国剩余定理(CRT)的初步理解

以前觉得用中国剩余定理来求同余方程组很鸡肋,因为可以用拓展欧几里得算法来构造出一种更加强大(可以处理取模的数(默认为mi)不互质的情况)的算法. 今天查了点资料,发现我太天真了. 首先讲讲中国剩余定理: 即 : x ≡ a[i] (mod m[i]) 1<= i <= r (m[i] 两两互质) 求这个同余方程组可以快速算: x = ∑M/m[i] * Inv(M/m[i], m[i]) * a[i] (mod M) 其中M = m[1]*m[2]*m[3]...m[r]  , Inv(x,

CSS (一)初步理解

通过牛腩新闻发布系统,接触了CSS,也感受到了它在做Web前台开发时简单方便易更改的优点. 尤其是后边对于CSS盒子的学习和认识,更加让人体会到网页设计和很多事物一样蕴含着深刻的思想和设计技巧,融于生活,表现生活. 本篇文章主要是对CSS内容概况的一些个人理解. CSS,即级联样式表.它真正做到了使网页表现层与内容分离的一种样式设计语言,做到了代码控制界面,简单易修改的解耦效果. 通过CSS,我们可以精确控制对象位置精确到像素级,还可以随心设计对象样式和风格,达到最优的美观度. 下面是CSS的一

CSS初步理解

最近在学习牛腩的时候遇到了网页的制作,挺新鲜的.当中涉及到了有关CSS的知识,于是乎自己也就花费两个小时的时间,找了本浅显易懂的书来看了一遍,从宏观上来了解CSS的相关内容.有关CSS的基础知识详见下链接. CSS基础知识 以下是对CSS理解的导图 通过上图我们也发现,CSS也很难,也容易.容易是说,学起来很快就可以上手,这中语言简单易懂,只要你具备小学英语的知识量就可以了.困难是在指学好它并不容易,因为它需要你耐心.就好比我们对word文档的排版,哪里需要主体鲜明一点,哪里需要着重突出一下,哪

Spring学习笔记--环境搭建和初步理解IOC

Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hibernate等其他众多的框架. 下面介绍环境的搭建,首先下载好spring的完整包,我下载的是4.2.5版本的,在elipse中,新建java项目: 1,导入核心jar包: 2.在src目录下,创建spring配置文件(名称可以自定义,一般写为beans.xml): <?xml version="1.

初步理解socket

近期研究下socket,发现自己还是有非常多不明确的地方,索性沉下心来,从最基础開始学习,開始看起,如今对自己的学习做下小小总结,以便和大家分享,如有谬误,敬请指正. 原创文章,转载请注明出处:http://blog.csdn.net/jessonlv TCP/IP 在学习socket之前,先回想下TCP/IP协议. TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机怎样连入因特网及数据怎样再它们之间

通过阅读Oracle Enterprise Asset Management User Guide,我对Oracle eAM的初步理解

通过阅读Oracle Enterprise Asset Management User Guide,我对Oracle eAM的初步理解 Oracle eAM是Oracle EBS套件的一部分,解决资产密集的组织的综合的和常规的设备维护需求.在设备层面追踪所有的维护成本和工作历史,来衡量绩效和最优化维护操作. eAM为组织提供了工具给资产和可重建的库存物料创建和应用维护程序.eAM让用户可以最大化地计划和安排维护活动,同时对组织的运作或生产中断最小.重要的是,它能提高资源有效性,增强维护质量,跟踪

初步理解require.js模块化编程

初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程,这标志”Javascript模块化编程”正式诞生. 在浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限:但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程. node.j

关于THINKPHP5模型关联的初步理解

初步理解的意思是,使用最常用的关联模型,然后可以正常运行 还是打个比方 文章表  和文章分类表 一个文章分类可以有多个文章  所以  文章分类模型和文章建立 hasMany的关联 而文章和文章分类表则建立belongto关联 注:belongto和hasMany第二个参数外键的定义请仔细查看教程 关联建立后,可以使用with所以查询关联,with是预载入的时候最常用 比如要查找文章的列表,想顺便展示文章的分类名 $list=Article::with('articleType')->where(

【Oracle】 oracle数据库的并发初步理解

先从一个列子来说:我们经常听到说某某网站的每天访问用户数有几十,几千,几百万甚至上千万,同时在线用户数有几万,几十万的. 从这个列子我们来分析,数据库并发的概念. 首先,这儿有两个名词,一个是每天访问的用户数,一个是同时在线用户数.那么这两个数据是不是就是数据库的并发数呢?Oracle数据库的一个相对比较稳定的并发数是200左右,也就是说一台比较好的服务器,并发数在200时,还能够正常的运行,不会死机.由此可见,上面两个数据都不是并发数. 我们再来了解这两个名词的含义. 访问用户数:一个大型的网