Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163956
  • 博文数量: 27
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 701
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-22 17:14
个人简介

诚信打天下

文章分类

全部博文(27)

文章存档

2013年(27)

我的朋友

分类: C#/.net

2013-03-04 08:33:49

既然泛型是新增加的特性,那来看一个比较运算的例子,在没有泛型之前怎么来处理的

比较运算小例子:

整数比较:


  1. using System;
  2. using System.Collections.Generic;//泛型命名空间
  3. using System.Linq;
  4. using System.Text;

  5. namespace ConsoleApplication1
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             
  12.             Int32 a = 213;
  13.             Int32 b = 21;
  14.             //调用比较运算
  15.             Int32 m = Min(a, b);
  16.             Console.WriteLine(m);
  17.         }


  18.         //比较获得最小的数字
  19.         static Int32 Min(Int32 a, Int32 b)
  20.         {
  21.             if (a < b)
  22.             {
  23.                 return a;
  24.             }
  25.             else
  26.             {
  27.                 return b;
  28.             }
  29.         }
  30.     }
  31. }


如果还想要浮点数比较怎么办?有人就说了,“白痴啊,这么简单问题还用想?在建一个方法不就行了“。这位仁兄只能对你句抱歉,不能这么做,因为这不符合面向对象三大特性之一,多态的概念,难道你忘了吗?

 

那使用object 不就解决了这个问题吗,他是所有类型的基类,用他来做数据的类型我想应该没什么问题了?

使用object的例子做加法运算的例子: 


  1. using System;
  2. using System.Collections.Generic;//泛型命名空间
  3. using System.Linq;
  4. using System.Text;

  5. namespace ConsoleApplication1
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             //调用比较运算
  12.             Object a = 213.1;
  13.             Object b = 21.2;
  14.             Double m = Convert.ToDouble(Min(a, b));
  15.             Console.WriteLine(m);
  16.         }
  17.         //比较获得最小的浮点数
  18.         static Object Min(Object a, Object b)
  19.         {
  20.             if (a < b)
  21.             {
  22.                 return a;
  23.             }
  24.             else
  25.             {
  26.                 return b;
  27.             }
  28.         }
  29.     }
  30. }

那位仁兄得意的笑了笑发话了:“嘿嘿,艾玛,这太完美了,我们仅用object就轻易的实现了多态,完美,完美实在是完美”。抱歉…. object 不支持比较运算符,在这里就算她支持,我们来分析一下。实际问题永远比你想象的复杂。使用object看似没有问题,其实在背地里给系统埋下了一颗无形的炸弹。你想如果传一个值类型
数字或浮点型进去,程序在执行时会执行装箱操作,处理完后,我们可能要数据做其他的事情继而需要拆箱,这一装一拆的瞎折腾系统的性能还能好吗?仁兄大惊:“这还了得,不能这样搞,那还有什么办法啊??“

“听说c# 引入了新特性泛型可以解决这个问题,要不咱们去看看?”,仁兄:“是吗?行 那还楞啥,走起~

 

我们已经意识到,c# 2.0
泛型所带来的优势。仁兄:“那她究竟长神马样子啊??”,“你看你急的,又不是娶新娘子。马上就到了哈,等我们一起把她神秘的面纱揭开看看就知道啦哈“,仁兄:“必须的,这个得让我来揭”,“行行行!不和你争”。

 

仁兄:“哎呦妈呀,累死我了,终于到了,这泛型还挺有个性的,蒙个蓝色面纱,里面究竟藏啥了“。我发话了:“真墨迹啊你,快快快,赶紧动手,揭开她的庐山真面目,让咱一探究竟。小心下手,别鲁莽,弄伤了人家还要上医院啊”。

 

揭开她华丽的面纱:


  1. T Min<T> (T a,T b) where T:约束类型

  2. {

  3. }

 

仁兄满脸疑惑的望着泛型:“这Twhere 都是啥呀,T 貌似还在哪见过?”。“是哎,有点眼熟。嘘 ……别动….听听,有动静,哇啊啊,原来悟道哥也在这儿
,你怎么有空跑这来转悠“。

仁兄:“什么情况????”。

神出鬼没的悟道哥就像一本百科全书,啥都知道,他的名字在江湖上无人不知无人不晓,。

悟道哥:“嘿嘿,我已在在这等候你们多时,这泛型长的很抽象,知道你们没见过世面,我是来给你俩讲解泛型的。
“。我:”谢谢悟道哥现身指点,老长时间没看望你了,改天一定给你带点特产过去!“。

悟道哥:“哎呦~~不要这么客气,给我带两包珍藏的烟就行~~ “。

 

悟道哥现身说法:

T是一种数据类型,对系统来说是一种暂时性未知数据类型,Min (T a, T b)表示这是关于类型T的方法,那这个类型T的类型可以是什么呢?这个要由 Where 后面的约束类型约定,这约束类型是必须的,一会你们用IComparble
泛型接口先替代上。泛型的类型转换工作其实是推迟到程序执行时由Jitter执行。Jitter负责将IL代码编译成机器代码,经过Jitter编译过的代码将不会再有转换内容。

 

我:“讲的可真详细,我俩笨拙,还得细细品味。我们先走一步,去和仁兄试试看哈,悟道哥我俩先撤了!“。

悟道哥:“恩。记得我的那个啥啊,你懂的“。

我:“啊???哦…..我懂的我懂的这个是必须的,你就慢慢等吧…..”。

 

悟道哥:“嘿嘿,现在你们只是初探泛型方法,实际上他还有个爸爸 泛型类(classs interface)。来来来…..给你们一个锦囊,切记..切记,一定要等到认识她爸再打开!“。说完悟道哥便消失丛林中。。。。


这家伙真奇怪,我们赶紧试下使用泛型如何:



  1. using System;
  2. using System.Collections.Generic;//泛型命名空间
  3. using System.Linq;
  4. using System.Text;

  5. namespace ConsoleApplication1
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             //调用比较运算
  12.             Double a = 213.1, b = 21;
  13.             Double res = Min(a, b);
  14.             Console.WriteLine(res);

  15.         }
  16.         //比较获得最小的浮点数
  17.         static T Min<T>(T a, T b) where T : IComparable<T>
  18.         {
  19.             if (a.CompareTo(b) > 0)
  20.             {
  21.                 return b;
  22.             }
  23.             else
  24.             {
  25.                 return a;
  26.             }
  27.         }
  28.     }
  29. }


阅读(623) | 评论(0) | 转发(0) |
0

上一篇:我的文章模板1

下一篇:了解AJAX

给主人留下些什么吧!~~