`
poson
  • 浏览: 361320 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C#.NET里面的数组是怎么实现的?

阅读更多

 

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.IListSystem.Collections.Generic.ICollection System.Collections.Generic.IEnumerable 泛型接口。由于实现是在运行时提供给数组的,因而对于文档生成工具不可见。因此,泛型接口不会出现在 Array 类的声明语法中,也不会有关于只能通过将数组强制转换为泛型接口类型(显式接口实现)才可访问的接口成员的参考主题。将某一数组强制转换为这三种接口之一时需要注意的关键一点是,添加、插入或移除元素的成员会引发 NotSupportedException

 

既然ArraySystem.Collections.Generic.IListSystem.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>的简写形式?

 

 

分享到:
评论

相关推荐

    asp.net c# 数组学习

    在C#编程语言中,数组是一种特殊的类型,用于存储同种数据类型的多个元素。数组具有固定大小,并且可以通过索引来访问这些元素。在C#中,数组的索引是从0开始的,这意味着一个包含n个元素的数组的索引范围是0到n-1。...

    asp.net中后台c#数组与前台js数组交互

    ASP.NET中后台C#数组与前台JS数组交互 在ASP.NET中,后台C#数组与前台JS数组的交互是一个常见的问题。前台JS数组需要从后台C#数组中获取数据,而后台C#数组则需要从数据库中获取数据。下面我们将详细介绍如何实现这...

    c#中结构数组的定义

    ### C#中结构数组的深度解析 #### 一、数组概览 在C#中,数组作为基础数据结构,提供了一种存储同类型元素的连续内存区域的方式。数组的索引从0开始,这一特性与许多其他编程语言相似。值得注意的是,C#中的数组...

    Visual C#.NET入门与提高

    1. 变量与数据类型:C#.NET支持多种数据类型,包括基本类型(如int、double、bool等)、引用类型(如类、接口、数组)和值类型(如结构体)。 2. 控制流:包括条件语句(if-else、switch-case)、循环(for、while、...

    应用程序设计编制(Visual C#平台)Visual C# .NET试题汇编(程序员级)

    《应用程序设计编制(Visual C#平台)Visual C# .NET试题汇编(程序员级)》是一本专注于Visual C# .NET编程技术的实践性教材,主要面向程序员级别的学习者。这本书通过一系列精心挑选的试题,旨在帮助读者深入理解...

    C# 读取数组Json文件

    本篇文章将深入探讨如何在C#中读取包含数组的JSON文件。 首先,我们需要了解JSON的基本结构。一个JSON文件通常包含键值对,可以表示对象或者数组。数组在JSON中用方括号`[]`表示,对象用大括号`{}`表示。例如,一个...

    c#.NET应用编程150例

    1. **基础语法**:C#.NET的基础包括变量定义、数据类型(如整型、浮点型、字符串、布尔型等)、控制流程(如if语句、switch语句、循环结构for、while、do-while)、函数的声明与调用、数组和集合的使用等。...

    Visual C#.NET与Visual Basic.NET的差异

    Visual C#.NET在数组索引和属性访问中使用方括号(`[]`),而Visual Basic.NET则在这些场景下使用圆括号(`()`)。 ### 7. **运算符** 尽管两种语言中的基本算术运算符(如+、-、*、/)相似,但Visual C#.NET和Visual ...

    Visual C#.NET编程精粹150例

    《Visual C#.NET编程精粹150例》是一本专为C#.NET开发者精心编写的实战指南,它涵盖了从基础到高级的各种编程技巧和实践经验。这本书的核心在于通过150个实例,深入浅出地讲解了C#.NET语言的关键特性和实际应用,...

    C,C#webservice 返回数组,二进制

    本主题主要关注的是如何在C#和C# Web服务之间传递数组和二进制数据。这两种语言都广泛应用于开发Web服务,尤其是C#,它提供了强大的.NET Framework支持,使得构建Web服务变得更加便捷。 标题“C,C# webservice 返回...

    Visual C#.NET 程序设计教程课后答案(罗福强、白忠建)习题答案1-14

    4. **题目解析**: 正确,C#.NET中可以通过类型转换来实现不同数据类型之间的转换。 5. **题目解析**: 错误,C#.NET中的数组下标是从0开始的。 #### 习题二知识点解析 **选择题解析** 1. **题目解析**: 选项A正确,...

    《Visual C#.NET程序设计(修订本)》作者杨晓光—PPT

    《Visual C#.NET程序设计(修订本)》是由著名计算机教育专家杨晓光编著的一本深入探讨C#.NET编程的教材。这本书旨在帮助读者掌握使用C#.NET进行软件开发的基本技能,尤其针对.NET Framework环境下的应用开发。PPT形式...

    C# 数组与序列化

    在C#编程语言中,数组和序列化是两个非常重要的概念。数组是数据结构的基础,序列化则是数据传输和持久化的关键技术。接下来,我们将深入探讨这两个主题。 **数组** 数组是C#中用于存储固定数量同类型元素的集合。...

    C#.NET案例开发集锦代码.rar

    《C#.NET案例开发集锦代码》是一个包含多个章节的代码资源库,主要针对C#.NET编程语言的应用实践。这个压缩包中集成了从第1章到第9章的示例代码,旨在帮助开发者深入理解和掌握C#.NET编程的各种技术和技巧。 C#.NET...

    asp.net 数组与序列化

    C#中可以使用`JavaScriptSerializer`或第三方库如Newtonsoft.Json(Json.NET)实现JSON序列化。以下是一个使用Json.NET的例子: ```csharp using Newtonsoft.Json; Person p = new Person() { Name = "John", Age =...

    Visual C#.NET 编程经典

    《Visual C#.NET 编程经典》是一本旨在帮助初学者和有经验的开发者深入理解C#编程语言的著作,特别是在.NET Framework环境下。这本书详细介绍了C#的基础语法、面向对象编程概念以及如何利用Visual Studio IDE进行...

    C# .NET 的会员积分管理系统

    本文将深入探讨一个基于C# .NET技术构建的会员积分管理系统,分析其设计原理、核心功能及实现方式。 首先,C# .NET是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows应用程序和Web服务。它结合了强大...

    C#.NET图片滚动

    在C#.NET编程环境中,创建一个图片...这个过程涉及到了控件操作、事件处理、网络请求和动画效果的实现,都是C#.NET编程中的基础但重要的知识点。在实际项目中,可以根据需求进行调整和优化,提升应用的交互性和美观性。

Global site tag (gtag.js) - Google Analytics