知识大全 从简单的例子理解泛型

Posted 类型

篇首语:做强者,战自卑;攀高峰,胜逆境;增才干,永学习;报效祖国为人民。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 从简单的例子理解泛型相关的知识,希望对你有一定的参考价值。

  前言        Net开发基础系列文章 对自己之前写过的代码备忘 如能给人予帮助 不甚荣幸 个人能力有限 如有差错或不足 请及时指正         从简单的例子理解泛型        话说有家影视公司选拔偶像派男主角 导演说了 男演员 身高是王道 于是有下面代码         //男演员实体类        public class Boy                //姓名        private string mName;        //身高        private int mHeight;        public string Name         get return this mName;                 public int Height         get return this mHeight;                 public Boy(string name int height)         this mName = name;        this mHeight = height;                        //演员选拔类        public class Compare                //导演导超女出生 喜欢一对一PK        public Boy WhoIsBetter(Boy boy Boy boy )                if (boy Height > boy Height)                return boy ;                else                return boy ;                                //测试        static void Main(string[] args)                Boy boy = new Boy( 潘长江 )         Boy boy = new Boy( 刘德华 )         Console WriteLine(new Compare() WhoIsBetter(boy boy ) Name)         Console ReadLine()                 代码很简单 Boy为男演员实体类 包含姓名和身高两个字段属性 Compare类中的WhoIsBetter为选拔逻辑方法 负责选出两个男演员中较高的那个 测试结果 刘德华完胜         任何行业都是一样 需求变更无处不在 第二天 需要选女主角 导演说了 女演员 苗条是王道 于是代码变更 添加了女演员实体类 添加了女演员的选拔方法         //添加女演员实体        public class Girl                //姓名        private string mName;        //体重        private int mWeight;        public string Name                get return this mName;                 public int Weight                get return this mWeight;                 public Girl(string name int weight)        this mName = name;        this mWeight = weight;                        //演员选拔类中添加一个女演员方法        public class Compare                //男演员身高是王道        public Boy WhoIsBetter(Boy boy Boy boy )                if (boy Height > boy Height)                return boy ;                else                return boy ;                        //女演员苗条是王道        public Girl WhoIsBetter(Girl girl Girl girl )                if (girl Weight < girl Weight)                return girl ;                else                return girl ;                                //测试        static void Main(string[] args)                Boy boy = new Boy( 潘长江 )         Boy boy = new Boy( 刘德华 )         Girl girl = new Girl( 巩俐 )         Girl girl = new Girl( 周迅 )         Console WriteLine(new Compare() WhoIsBetter(boy boy ) Name)         Console WriteLine(new Compare() WhoIsBetter(girl girl ) Name)         Console ReadLine()        

        结果选出了身高更高的刘德华 选出了体重更轻的周迅 导演很满意 但从程序设计角度 这段代码显然不够完美 第一天选男主角 第二天选女主角 往后还要选男配角 选女配角 选群众……按目前方式 只有往Compare类里不断添加方法才能满足导演需求 方法会越来越多 代码会越来越长 于是 我决定修改WhoIsBetter方法 让它以后可以支持男主 女主 男配 女配 男群众 女群众甚至支持所有两个对象之间的比较         /// <summary>        /// 男演员 实现IComparable接口        /// </summary>        public class Boy : IComparable                //姓名        private string mName;        //身高        private int mHeight;        public string Name         get return this mName;                 public int Height         get return this mHeight;                 public Boy(string name int height)         this mName = name;        this mHeight = height;                public int CompareTo(object obj)                //比较身高        return this mHeight ((Boy)obj) Height;                        /// <summary>        /// 女演员 实现IComparable接口        /// </summary>        public class Girl : IComparable                //姓名        private string mName;        //体重         private int mWeight;        public string Name                get return this mName;                 public int Weight                get return this mWeight;                 public Girl(string name int weight)        this mName = name;        this mWeight = weight;                public int CompareTo(object obj)                //比较体重        return ((Girl)obj) Weight this mWeight;                        首先让实体类支持自定义的比较 男演员比较身高 女演员比较体重 自定义比较是通过实现IComparable接口完成的 在C#里但凡可以比较的类型 比如int double char等都实现了IComparable接口 关于IComparable接口此处不作详述 请读者自行查阅相关资料         public class Compare                //万物皆object        public object WhoIsBetter(object obj object obj )                object result = obj ;        //判断比较类型必须相同        if (obj GetType() == obj GetType())                switch (obj GetType() ToString())                //男演员选拔        case Generic Boy :        if (((Boy)obj ) CompareTo(obj ) > )                result = obj ;                break;        //女演员选拔        case Generic Girl :        if (((Girl)obj ) CompareTo(obj ) > )                result = obj ;                break;        //扩展int类型比较        case System Int :        if (((System Int )obj ) CompareTo(obj ) > )                result = obj ;                break;                        return result;                        修改WhoIsBetter方法 除了支持对男演员 女演员的比较 为了展示其扩展性 还新增了int类型的比较         //测试        static void Main(string[] args)                Boy boy = new Boy( 潘长江 )         Boy boy = new Boy( 刘德华 )         Girl girl = new Girl( 巩俐 )         Girl girl = new Girl( 周迅 )         Console WriteLine(((Boy)new Compare() WhoIsBetter(boy boy )) Name)         Console WriteLine(((Girl)new Compare() WhoIsBetter(girl girl )) Name)         Console WriteLine(new Compare() WhoIsBetter(boy Height boy Height))         Console WriteLine(new Compare() WhoIsBetter(girl Weight girl Weight))         Console ReadLine()                 测试结果         刘德华        周迅                        OK 截止目前 似乎比较完美了 男演员比身高 女演员比体重 还支持int类型比大小 WhoIsBetter方法具有了重用性 如果有需要 往后还能扩展 拿来比较任意两个对象 在泛型出现以前 似乎确实比较完美 但这也只是相对的 我们来看看目前代码的弱点         弱点 :方法的重用性        假设我们要让WhoIsBetter方法支持更多类型 比如支持基本的double char bool类型 支持以后导演可能提出的配角比较 群众比较 那么就必须不断的扩展方法内部代码 这带来极大的维护成本         弱点 :类型安全问题        //测试        static void Main(string[] args)                Boy boy = new Boy( 潘长江 )         Boy boy = new Boy( 刘德华 )         Girl girl = new Girl( 巩俐 )         Girl girl = new Girl( 周迅 )         Console WriteLine(((Boy)new Compare() WhoIsBetter(boy girl )) Name)         Console ReadLine()                 如上代码我拿潘长江跟巩俐去比较 虽然万能的object给我们带来了便捷 同时也带来了风险 这段代码编译完全可以通过 但运行时会出现异常 girl对象是没法转换为Boy类型的 现实里去韩国可以变性 但代码里绝对不行 所以这个方法就像颗定时炸弹 一不小心传错了参数 就会导致严重后果 并且编译阶段完全不被发现         弱点 :装箱拆箱导致的性能问题        当向WhoIsBetter方法中传递int参数时 object转换为int导致了拆箱操作         if (((System Int )obj ) CompareTo(obj ) > )        反编译获取MSIL:        IL_ :  unbox any  [mscorlib]System Int         C#是强类型语言 但只要引用类型与值类型的相互转换 就避免不了Box与Unbox 有关装箱与拆箱的知识请读者自行查阅相关资料 此处不作详述         理解泛型        OK 到泛型登场了 摘录了一段MSDN中对泛型的描述 泛型类和泛型方法同时具备可重用性 类型安全和效率 这是非泛型类和非泛型方法无法具备的 这三点 跟我们上面的例子相吻合         看看使用泛型的解决方案         public class Compare<T> where T : IComparable                public T WhoIsBetter(T t T t )                if (t CompareTo(t ) > )                return t ;                else                return t ;                                //测试        static void Main(string[] args)                Boy boy = new Boy( 潘长江 )         Boy boy = new Boy( 刘德华 )         Girl girl = new Girl( 巩俐 )         Girl girl = new Girl( 周迅 )         Console WriteLine((new Compare<Boy>() WhoIsBetter(boy boy )) Name)         Console WriteLine((new Compare<Girl>() WhoIsBetter(girl girl )) Name)         Console WriteLine(new Compare<int>() WhoIsBetter(boy Height boy Height))         Console WriteLine(new Compare<string>() WhoIsBetter(boy Name girl Name))         Console ReadLine()                 这段代码在优雅度上完胜非泛型 并且可重用性大大提升 可以说它支持所有类型的比较 只要这个类型实现了IComparable接口 同时一劳永逸 不再需要在方法内部作任何扩展         public class Compare<T> where T : IComparable        //…                泛型类的定义是在类名后面跟上<T> 这个是泛型专用语法 T表示传递进来的类型 你也可以用别的字母代替         where T : IComparable 从字面上就能理解 这段表示对T的类型约束 程序是遵循人的意志来执行的 按前面的例子 如果莫名其妙的让程序比较两个object 它没办法知道该去怎么比较 所以我们必须告诉程序 T必须是可比较的类型 T必须实现了IComparable接口         关于泛型参数约束 MSDN提供了一张表格 约束 说明 T 结构 类型参数必须是值类型 可以指定除Nullable 以外的任何值类型 T 类 类型参数必须是引用类型 这一点也适用于任何类 接口 委托或数组类型 T new() 类型参数必须具有无参数的公共构造函数 当与其他约束一起使用时 new() 约束必须最后指定 T <基类名> 类型参数必须是指定的基类或派生自指定的基类 T <接口名称> 类型参数必须是指定的接口或实现指定的接口 可以指定多个接口约束 约束接口也可以是泛型的 T U 为T 提供的类型参数必须是为U 提供的参数或派生自为U 提供的参数  DEMO下载Visual Studio Net Framwork   cha138/Article/program/net/201311/13572

相关参考

知识大全 java中使用泛型

  泛型是在jdk之后才出现的一种机制说简单点就是一个特定的对象可以接收任何的对象例如杯子可以装水也可以装饮料说简单点就是来者不拒什么都要下面我就来写个小例子看一下  写一个接口Info里面什么方法都

知识大全 构建可反转排序的泛型字典类(1)--雏形

  前言  前段时间为了查找泛型资料我翻译了OReilly出版的《C#Cookbook》这本书的几个关于泛型的章节其中反转SortedList里的内容(见)这一节中有一个接近行代码的例子当时看到这个例

知识大全 一个例子理解C#位移

一个例子理解C#位移  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很多人觉得位移这东西很复杂二

知识大全 怎么理解任何事物都是质与量的统一体,能举个例子说明吗

怎么理解任何事物都是质与量的统一体,能举个例子说明吗??理解之前,还要理解任何事物都是不断发展变化的,(运动与静止辩证统一理论,也一定要理解)。理解“发展变化”:一个成熟的苹果,在自然环境中,你可以想

工业废水处理流程

工业生产的多样性使产生的排水污染性质也纷繁复杂,如有机污染、无机污染、热污染、色度污染等等。因此,工业废水的处理不能从简单的几个标准COD、BOD、ss、pH就套用别人的工艺和设备,除上述指标外,影响

工业废水处理流程

工业生产的多样性使产生的排水污染性质也纷繁复杂,如有机污染、无机污染、热污染、色度污染等等。因此,工业废水的处理不能从简单的几个标准COD、BOD、ss、pH就套用别人的工艺和设备,除上述指标外,影响

工业废水处理流程

工业生产的多样性使产生的排水污染性质也纷繁复杂,如有机污染、无机污染、热污染、色度污染等等。因此,工业废水的处理不能从简单的几个标准COD、BOD、ss、pH就套用别人的工艺和设备,除上述指标外,影响

建筑的终极目标是养生

茫茫宇宙中,繁星种种,但只有地球能够承载人的生命,只有地球能够让人类繁衍生息。自古以来,人类就对住宅环境与健康的关系不断地进行着研究和探索,从简单的躲风避雨———对自然灾害的预防,到依山傍水,乃至对地

通过对要学习的新材料增加相关信息来达到对新材料的理解和记忆的方法,如补充细节、举出例子,或使之与其他观念形成联想,这种促

通过对要学习的新材料增加相关信息来达到对新材料的理解和记忆的方法,如补充细节、举出例子,或使之与其他观念形成联想,这种促进知识保持的方法是_____。A、过度学习B、深度加工C、组块化编码D、及时复习

几种焦化废水深度处理技术的比较

焦化废水主要来自炼焦、煤气净化及化工产品的精制过程。焦化废水所含污染物包括酚类、多环芳香族化合物以及含氮、氧、硫的杂环化合物等,是一种典型的难降解有机废水。我国焦化废水处理技术从简单的机械除油技术发展