日期:2014-05-18  浏览次数:20764 次

C#数组、集合、泛型深入总结
问题:【数组】、【集合】、【泛型集合】的区别与联系。
【数组】C#数组是个很重要的概念,在C#类库中,它属于基本常用的类型,和int,string等是一级别的,是C#最基础、最核心的部分,它是相同类型的一组集合,当然,它也是安全的;但数组确实也比较奇怪,它到底属于什么类型?比如int[] a,A[] a1;确实找不到a或a1的类型定义,即使在CIL中也无此定义,如果用a.GetType(),你得到是System.int32[]----这不纯属扯淡嘛,这种类型找的着吗?
但有两点需要注意:其一,数组也是一个对象,它派生于抽象类Array;其二,数组对象的实例化和C#中其它任何引用类型的实例化都不相同,引用类型是.newobj,而数组是.newarr指令。这两点很重要,我们可以推测下数组对象的类型到底是什么,诸如C#编译器遇到int[],A[],B[]……..等时,应该映射成各个继承Array的可类,然后才是实例化,这咋一看有理,再想想就可笑了,IL只有个.newarr指令;如果我们要用C#设计一个高效可重用的数组类,我们怎么办?这几乎是不可能的,其实数组很容易理解,刚才的newarr就说明了一切,C#中的数组操作已经固化成一个特定的指令了,这样它就和其它类型不一样了,显得低级化了;实际看来,C#数组和泛型的效率至少不低于C/C++及STL,它们不是被面向对象化了,而是虚拟了面向对象,这样看来,它们的实现不是面向对象的封装,至少是C/C++级别的特定安全实现,甚至是用汇编或机器指令写的,如此看来,再索求数组和泛型是什么类型时倒显得有些荒唐了,我们姑且就认为它是面向对象化了,当然看到的都是假象,这些假象中又最重要的一点---这个所谓的假数组对象也有一个假的索引器,这样看起来和真实对象的索引器就是一个概念。
C#数组对象的特点就是虚拟成了面向对象,有了索引器概念,是面向对象的,是安全的,又是很高效的,当然也是最不灵活的!
【集合】由于要灵活,集合就产生了,它是做为一个通用的算法产生的,有ArrayList,Stack….提供了常用的容器,这种通用性是用万能的object实现的;
特点就是:可以装各个类型(这违背了数组单一化原则,除非迫不得已,千万不要这么做),存在类型不安全因素,性能差劲!
针对此,出现了自定义的加强版的集合-----强类型集合,它解决了安全性,但是通用性差,性能低。
由此可年,通吃各种类型到成了唯一的特点,除非迫不得已,不要用。
【泛型集合】于是,除了有灵活性和通用性特点外,安全和高效的集合便诞生了,同时,泛型的概念也推广话了
  在自定义泛型集合中,引出了约束占位符类型的语法规则,要了解一下!
  泛型思考,泛型是一种思想,主要体现在算法上,它最大特点就是在不牺牲效率的前提下实现算法的通用性-----真正实现代码的重用,其抽象级别要比面向对象高;泛型是面向算法(过程)编程,脱离数据,实现算法(模式)的重用性;面向对象是面向大型软件的编程,封装数据和算法,通过继承和组合实现组件(代码)的可重用性。
  泛型类、泛型接口、泛型代理、泛型方法;
泛型类相比类而言,更抽象,跟应该体现在算法和数据容器的作用,除此以外,慎用泛型,它并不是万能的!
  泛型接口相比接口而言,更体现接口约定的抽象性
  泛型代理更能体现方法类型的抽象性
  泛型方法更能体现算法的抽象性,泛型方法能实现的算法,一定能用函数重载实现,而函数的重载不一定能用泛型方法实现,最重要的是泛型方法内不允许有占位符类型参与各种运算操作,这大大限制了泛型的功能。
  总结:泛型类型是定义时用占位符, 占位符只能出现在泛型类型定义内或泛型方法内

------解决方案--------------------
支持lz的原创分享心得。

不过在叙述组织上,概念的严谨上还有些改进的余地。
------解决方案--------------------
在您那篇c#之父的帖子中已经这么评价过在下了
您真的是血气方刚啊。
我刚才一直都是在建议,
你有没有考虑过为什么这么多人都爱看你的脚呢?
大家全疯了,就您清醒?
如果真是这样对您也不是什么好事儿啊。
只是建议您别一点别人的话也听不进去,
不一定所有的事儿你都是对的。
至于您所说的我不适合做it,
也许真的很有道理,
我考虑一下。
探讨

引用:
哈哈,楼主真爱较劲啊
为什么你发的每个帖子都要和别人抬杠呢?
真不知道你技术有多牛,
就算是在牛,你连分享的文章别人有不同意见都不允许,
又有什么用呢?
你要是出生早点有机会当个暴君啊,
当然,也有可能是个死得很惨的固执的学者。
做人大肚点,学术研究高值得人尊重,
如果心胸再宽广点你就是个伟人啊。
不一定非要别人都说你是对的。
别跟我争……