MSDN(c#2.0):
数组的元义是相同类型(type)的一组"变量"。它是类型声明的,如type[] arrayName;
数组类型用成对的'[' ']'表示,默认情况下,[]内可不填写硬代码(hardcode),c#会根据情况自动分配;
数组元素用成对的'{' '}'表示;{}标界数组单元;
在c#中,数组提升为对象层次,不再仅仅是c和c++中连续可及(addressable)的内存区域;
一个元素就是数组中的一个值;数组的长度是它可包含的元素总数;数组的秩是数组中的维数;数组中维度的下限是数组中该维度的起始索引,多维数组的各个维度可以有不同的界限。
数组的属性:
(1)形态上可以是一维、多维或多重交错的(一维数组的意义在于纯对值处理);
(2)数值类型数组的元素默认为零,而引用类型数组的元素默认为null;后者需要显式地实例化;前者就int[] ints={1,2,3} 好了;)
(3)多重交错数组是数组的数组(an array of arrays),类型是引用类型;
(4)数组元素的索引是从零开始,即n个元素的数组,它的索引是从0到n-1;
(5)数组元素的类型可以是任何类型,当然也包括数组;
(6)array的抽象基类型(abstract base type)是Array,可使用基类的所有属性和成员,如Rank属性表示维度,或格致;
(7)Array基类型已经实现了IEnumerable接口和IEnumberable<T>泛型接口,可以使用foreach对数组的元素进行遍历(iteration);
(8)隐式类型的数组。
一、数组作为函数的参数
数组是引用类型,故可以改变其值,常用来作为函数参数。
(1)参数可以是已经初始化的数组,如 void PrintArray(int[] arr) { // method code }
(2)也可以在参数中初始化一个新数组,如 PrintArray(new int[] { 1, 3, 5, 7, 9 });
二. 使用out或ref
1. 基础知识
(1)这两个关键字(keyword),都能使参数以引用方式传递(be passed by reference);
(2)在调用方法(calling method,实参)和方法定义(method defination,形参)中,都必须显式地使用该关键字;
(3)运行时段(run-time)的区别,out要求调用方法在返回(method return)前对其处理,可以返回值也可以返回对象;
ref强调参数在传递之前就将其初始化,也可传递引用类型;
(4)在编译时段(compile time),ref和out不构成函数的多态性(方法重载)。即一个方法不能使用了ref后,又使用out,反之亦然,如
class CS0663_Example { // compiler error CS0663: "cannot define overloaded // methods that differ only on ref and out" public void SampleMethod(out int i) { } public void SampleMethod(ref int i) { } }
(5)若要构成方法重载(overloaded methods),二者只用其一,如
class RefOutOverloadExample { public void SampleMethod(int i) { } public void SampleMethod(out int i) { } }
(6)属性不是变量,不能用作out或ref的参数;
2. 数组类型的out或ref参数
(1)同所有的out参数一样,必须由被调用方(callee)处理;
(2)同所有的ref参数一样,必须由调用方(caller)处理。
//主要用途示例: class TestOut { static void FillArray(out int[] arr) { // Initialize the array: arr = new int[5] { 1, 2, 3, 4, 5 }; } static void Main() { int[] theArray; // Initialization is not required // Pass the array to the callee using out: FillArray(out theArray); // Display the array elements: System.Console.WriteLine("Array elements are:"); for (int i = 0; i < theArray.Length; i++) { System.Console.Write(theArray[i] + " "); } } }
三、在数组中使用foreach语句(statement)
(1)用简单清晰地方式遍历数组
//遍历单维数组 int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 }; foreach (int i in numbers) { System.Console.WriteLine(i); } //遍历多维数组 int[,] numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } }; foreach (int i in numbers2D) { System.Console.Write("{0} ", i); }
(2)但,对于多维数组,嵌套的for循环,能对数组元素,进行更好地控制。
四、多重交错数组
注,这里将这种数组类型单列出来,是因为它杰出的性能。如下图,
(1)数组的元素是数组,这样的数组被称作嵌套数组、多重数组,或交错数组.个人认为嵌套数组的叫法更准确。因为与多维数组相比,两者在数组元素存储方式上的不同,多维数组是连续存放,通过偏移量(offset),即可确定数组元素,而嵌套数组明显与此不同;
(2)这样,数组的元素之间,就可以是不同的维数(dimension)和大小(size).如3个元素的一维多重数组,声明为
int[][] jaggedArray = new int[3][];
(3)使用嵌套数组前,元素必须被初始化.如
jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];
或,
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 };
jaggedArray[1] = new int[] { 0, 2, 4, 6 };
jaggedArray[2] = new int[] { 11, 22 };
或,
int[][] jaggedArray2 = new int[][]
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};
或简写为,
int[][] jaggedArray3 =
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};
(4)嵌套数组和多维数组混合。
int[][,] jaggedArray4 = new int[3][,]
{
new int[,] { {1,3}, {5,7} },
new int[,] { {0,2}, {4,6}, {8,10} },
new int[,] { {11,22}, {99,88}, {0,9} }
};
//访问方式,输出5
System.Console.Write("{0}", jaggedArray4[0][1, 0]);
//主要用途示例 class ArrayTest { static void Main() { // Declare the array of two elements: int[][] arr = new int[2][]; // Initialize the elements: arr[0] = new int[5] { 1, 3, 5, 7, 9 }; arr[1] = new int[4] { 2, 4, 6, 8 }; // Display the array elements: for (int i = 0; i < arr.Length; i++) { System.Console.Write("Element({0}): ", i); for (int j = 0; j < arr[i].Length; j++) { System.Console.Write("{0}{1}", arr[i][j], j == (arr[i].Length - 1) ? "" : " "); } System.Console.WriteLine(); } } }
五、数组拷贝的几种方式
(1) 对源数组的元素逐个复制;
(2)Copy方式,把某个数组在一定范围内的元素拷贝到另外一个数组,并且根据需要执行类型转换(cast)和装箱;
(3)CopyTo方式,拷贝当前一维数组从指定索引位置(index)开始的元素到另外一个数组;
(4)Clone方式,数组的浅表复制(shallow copy)。
a/即,无认是数值还是引用类型,它都只复制数组的元素,但不拷贝引用所指向的对象。目标数组和源数组是指向相同的对象。
b/数组的深复制(deep copy)不仅拷贝元素,而且拷贝元素直接和间接引用的全部。
c/clone的数组和原来的数组是相同的类型(same type);
d/该方法是O(n)操作,n是长度。
//主要用途示例 Array.Copy(weekDays,copyArr1,copyArr1.Length); // Copies the source Array to the target Array, starting at index 6.注,0表示全部 mySourceArray.CopyTo( myTargetArray, 6 ); // Create a clone of the CultureInfo array. CultureInfo[] arrCIClone = (CultureInfo[]) arrCI.Clone();
六、隐式类型数组
借助于var关键字(c#3.0)的本地变量的推理类型(inferred type) 的能力--通过表达式右侧的初始化语句来推理(自动判断)变量的类型,使得单维数组同样受益。
(1)可以创建隐式类型的数组,数组实例的类型是由数组初始化的元素推理得到。
(2)隐式类型数组常用于查询表达式中,和匿名类型/对象/集合(collection)的初始化器,一起使用。
//用途示例 class ImplicitlyTypedArraySample { static void Main() { var a = new[] { 1, 10, 100, 1000 }; // int[] var b = new[] { "hello", null, "world" }; // string[] // single-dimension jagged array var c = new[] { new[]{1,2,3,4}, new[]{5,6,7,8} }; // jagged array of strings var d = new[] { new[]{"Luca", "Mads", "Luke", "Dinesh"}, new[]{"Karen", "Suma", "Frances"} }; } }
小结:数组的元义是相同类型的变量组--有意义的线性编程的基准。语言高级特征的内核(kernel)。
优点:(1)数组是性能计算的利器。
(2)在.NET2.0框架中,Array类实现了System.Collections.Generic.IList、System.Collections.Generic.ICollection 和 System.Collections.Generic.IEnumerable 泛型接口。(由于实现是在运行时提供给数组的,因而对于文档生成工具不可见。)
发表评论
-
ZT,一篇好文
2010-05-03 10:33 999读读语言大牛们(其中有位是Anders)这篇文章,会很受益。( ... -
关于“匿名方法”与“lambda操作符”的实现
2010-03-24 22:29 871在<关于“回调”的实现>一文中,我们探讨了使用委托 ... -
effective hierarchy(二)之 函数合辑(2)
2009-09-16 21:29 727介绍: 本节我们来看看另外一种封装,构建件。构建件作为 ... -
effective hierarchy(二)之 函数合辑(1)
2009-08-19 14:53 781“暴露”阶段:值-> ... -
effective hierarchy(一)之 基本概念(8)
2009-07-02 23:39 686MSDN,C#2 一、语句 1.结束点和可达性(en ... -
effective hierarchy(一)之 基本概念结束篇
2009-06-30 15:41 663一、函数/功能成员(fun ... -
effective hierarchy(一)之 基本概念(7)
2009-06-23 21:15 937以下可跳过: [立记保留:到现在为止,我满意的是认真的精神。 ... -
effective hierarchy(一)之 基本概念(6)
2009-06-21 00:34 949MSDN,C#2.0 转换(conversions) ... -
effective hierarchy(一)之 基本概念(5)
2009-06-18 22:16 715MSDN,C#2.0 变量基本点: 变量代表 ... -
effective hierarchy(一)之 基本概念(4)
2009-06-15 15:59 727MSDN,C#2.0: 一、名字空间和类型名称(nam ... -
effective hierarchy(一)之 基本概念(3)
2009-06-14 15:00 730MSDN,C#2.0: 一、签 ... -
effective hierarchy(一)之 基本概念(2)
2009-06-13 18:22 828MSDN:基本概念 一、 ... -
effective hierarchy(一) 之基本概念(1)
2009-06-11 09:37 779我告诫自己,不要忽略简单的东西,又要扎实。所以这一篇开始,专门 ... -
effective hierarchy(一)之 属性与索引器
2009-06-07 14:07 1149编程笺言:“优良的设计 ... -
effective hierarchy(一)之 从array说起(4)
2009-06-07 00:53 804回顾:上一节中,我们 ... -
effective hierarchy(一)之 从array说起(3)
2009-06-06 21:20 701回顾: 从上一节中,可以看出枚举的易用性对数组使用的启示意义 ... -
effective hierarchy(一)之 从array说起(2)
2009-06-06 09:34 691复习: 从上一节,可 ... -
effective hierarchy(一)之 C#中的new
2009-05-27 23:21 840MSDN(c#2.0): 在msdn中,指出new的三种用法。 ...
相关推荐
Hierarchy Viewer 可以从 Android SDK 工具包中启动,通过命令行的方式可以启动。启动后,可以看到当前正在运行中的模拟器的信息,可以鼠标点击已经启动了的 Activity。 四、Inspecting Screenshots Inspecting ...
Hierarchy PRO 2021 v2021.1u9
Hierarchy PRO是一个高级的Hierarchy面板扩展,它提供了更多的自定义选项和便捷的功能。此插件可能包括但不限于以下特性: 1. **过滤与排序**:Hierarchy PRO允许用户根据需求筛选和排序场景中的游戏对象,比如按...
解决这个启动 View Hierarchy时的这个bug: hierarchy viewer unable to debug device
### SAP BW Hierarchy Extractor:从SAP R3系统抽取自定义层级至BW系统的架构 #### 业务场景 在很多企业环境中,管理者需要能够访问其下属员工所负责的数据。尽管SAP Business Warehouse (BW)提供了丰富的业务内容...
Hierarchy Viewer是Android SDK中自带的一款强大的UI设计与检测工具。它位于Android SDK的`tools`目录下,文件名为`hierarchyviewer.bat`。对于Android开发者来说,这是一个不可或缺的工具,能够帮助他们在开发过程...
效果及使用方法:https://blog.csdn.net/qq_26318597/article/details/131373576 1.导入插件包 2.选中Hierarchy中的物体 3.右键选择“复制Hierarchy路径” 4.Ctrl + V 粘贴
#### 一、Hierarchy Viewer概览 Hierarchy Viewer是一款由Google提供的强大工具,专为Android开发者设计,旨在辅助界面设计、调试及优化工作流程。通过直观地展示应用UI的层级结构,它使得开发者能够轻松识别布局...
IRQ Hierarchy 的初始化及构建过程详解 IRQ(Interrupt Request)是计算机系统...IRQ hierarchy 的初始化及构建过程是一个复杂的过程,涉及到多个函数和数据结构。理解这些函数和数据结构对于系统的正确运行至关重要。
Unity是世界上最流行的游戏开发引擎之一,它为开发者提供了丰富的工具集来创建交互式3D和2D内容。在Unity中,Hierarchy面板是一个至关重要的组成部分,它显示了场景中的所有游戏对象及其层次结构。QHierarchy是一款...
Enhanced_Hierarchy_2.0_v2.4.5.unitypackage 最新版本哦 正版
Unity是世界上最受欢迎的游戏开发引擎之一,它提供了丰富的工具和功能,让开发者能够创建高质量的2D和3D游戏。在Unity中,"层级编辑器"(Hierarchy)是至关重要的一个部分,它允许开发者组织和管理场景中的游戏对象...
通过阅读和理解《VS2010 MFC Hierarchy Chart》的三个部分(MFC_Hierarchy_Chart1of3.pdf、MFC_Hierarchy_Chart2of3.pdf、MFC_Hierarchy_Chart3of3.pdf),开发者可以深入理解MFC的内部结构,从而更好地利用MFC开发...
在前端开发领域,数据可视化是一项重要的技能,它能够将复杂的数据转化为直观的图形,帮助用户...同时,对于想要深入D3.js的学习者,这是一个很好的实践案例,可以从中学习如何从数据解析、布局计算到最终的图形渲染。
WPF Class Hierarchy
Hierarchy2 v1.3.10.0
*商用请支持正版* 2019/5/14更新更新的Hierarchy PRO - Auto HighLighter v21.3f1
总结来说,HierarchyViewer是Android开发者必备的工具之一,它提供了对应用界面进行深入分析和优化的能力。熟练掌握并运用HierarchyViewer,不仅能够提升应用的性能,还能让用户体验更上一层楼。在实际开发中,我们...