C#.NET里面的数组是怎么实现的?
探讨数组的实现,List转换为Array的原理。
我们应该多用C#里面的数组还是链表呢?Array还是泛型List<T>。
问题:
(1) 由于C#的数组可以通过List转换。当List的长度很大的时候,需要很大的内存,我们相信数组不是一整块内存组成。那么数组必然是由多块内存组成。很自然,可以想到数组是由链表+数组组成。
(2) List转换为数组需要花费多少时间?
(3) Array是用什么组成的?
参看MSDN的介绍:
看看msdn对数组的定义:
(1) 在C#中,数组实际上是对象,而不只是像 C 和 C++ 中那样的可寻址连续内存区域。Array 是所有数组类型的抽象基类型。可以使用 Array 具有的属性以及其他类成员。这种用法的一个示例是使用 Length 属性来获取数组的长度。
(2) 数组类型是从抽象基类型 Array 派生的引用类型。由于此类型实现了 IEnumerable 和 IEnumerable,因此可以对 C# 中的所有数组使用 foreach 迭代。
数组是从Array派生的引用类型。
(3) 再看看对Array的介绍
Array 类是支持数组的语言实现的基类。但是,只有系统和编译器能够从 Array 类显式派生。用户应当使用由语言提供的数组构造。
一个元素就是 Array 中的一个值。Array 的长度是它可包含的元素总数。Array 的秩是 Array 中的维数。Array 中维度的下限是 Array 中该维度的起始索引,多维 Array 的各个维度可以有不同的界限。
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 7.5pt; HEIGHT: 7.5pt" alt="Note" type="#_x0000_t75"><imagedata o:href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref2/local/note.gif" src="file:///C:%5CDOCUME~1%5Czhl%5CLOCALS~1%5CTemp%5Cmsohtml1%5C03%5Cclip_image001.gif"></imagedata></shape>重要事项:
|
在 .NET Framework 2.0 版中,Array 类实现 System.Collections.Generic.IList、System.Collections.Generic.ICollection 和 System.Collections.Generic.IEnumerable 泛型接口。由于实现是在运行时提供给数组的,因而对于文档生成工具不可见。因此,泛型接口不会出现在 Array 类的声明语法中,也不会有关于只能通过将数组强制转换为泛型接口类型(显式接口实现)才可访问的接口成员的参考主题。将某一数组强制转换为这三种接口之一时需要注意的关键一点是,添加、插入或移除元素的成员会引发 NotSupportedException。
既然Array由System.Collections.Generic.IList、System.Collections.Generic.ICollection 和 System.Collections.Generic.IEnumerable实现。那么Array就是由链表,集合和枚举器组成的。
|
Array.Copy 方法不仅可在同一类型的数组之间复制元素,而且可在不同类型的标准数组之间复制元素;它会自动处理强制类型转换。
(4) ToArray是否耗费更多的时间和空间
MSDN:元素使用 System.Array.Copy 来进行复制,后者为一种 O(n) 运算,其中 n 为 Count。
此方法的运算复杂度为 O(n),其中 n 是 Count。
这说明ToArray需要额外的内存空间存放新的数组。
(5) 是否int[] 可以看成是Array<int>的简写形式?
分享到:
相关推荐
C# 数组从零开始建立索引,即数组索引从零开始。C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似。但还有一些差异应引起注意。 声明数组时,方括号 ([]) 必须跟在类型后面,而不是标识符后面。在 C# 中...
c#中结构数组的定义,很全的
asp.net中后台c#数组与前台js数组交互上述代码即为我解决问题所用代码,均已试验通过。
C# 读取数组Json文件
数组排序(冒泡)(c#.net源码).rar 数组排序(冒泡)(c#.net源码).rar 数组排序(冒泡)(c#.net源码).rar 数组排序(冒泡)(c#.net源码).rar
C# 将整型数组元素转换为字符串.别忘了给评分!
asp.net 数组与序列化! 很值得下载看看!资源免费,大家分享!!
C#.NET程序设计教程课件5数组和指针
C#中的三种字节数组拼接方式的性能对比测试DEMO。 博文地址:http://blog.csdn.net/sqqyq/article/details/50986977
Visual C#.NET是一门完全面向对象的程序设计语言,具有简单、现代、类型安全、性能优良等特点,是面向对象程序设计教学的主干语言之一。本书共分15章,全面讲解了面向对象的程序设计概念、Visual C#的数据类型和...
C#中 二维数组,阵列,基本语法。 10-1. 陣列種類: 2 10-2. 陣列的宣告方式 2 10-3. 指定初值的陣列宣告方式 3 10-4....10-5. 比較VB.NET與C#.NET的陣列 4 10-6. 範例練習[exp10-1]:二維陣列輸入成績 5
《visualc#.net应用教程(第2版)(visual c#.net 2008版)》共分15章,全面讲解了面向对象的程序设计概念、visualc#的数据类型和表达式、visualc#的程序设计语句、数组、面向对象的程序设计方法与原理、控件与窗体...
基于.NET 的会员积分管理系统 包含VS2005和VS2008两版本代码以及数据库,供开发参考
第1章 C#编程基础 实例1 Hello C#! 实例2 HeyGuy 实例3 预定义类型 实例4 类型转换 实例5 选择语句 实例6 循环语句 实例7 跳转语句 实例8 数组 实例9 枚举与结构类型 实例10 类 ...
合并一维字符串数组并去重,提供了一个简单的小实例,可以试试看更复杂的情况是否可以处理得好。
C#变通方法实现VB6.0里面的控件数组,当然VB.net也可以用,,用了三种方法 ,代码添加事件,属性页里设置事件,判别并处理.
c#实现对泛型数组排序
C#.NET实验指导书-实验4-数组[归纳].pdf
在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type=text name=[0].Name /> <input type=text name=[1].Name /> <input...
使用数组列表ArrayList填充ListBox