如果需要使用同一类型的多个对象,就可以使用集合和数组。c#用特殊的记号声明和使用数组。array类在后台发挥作用,为数组中元素的排序和过滤提供了几个方法。
使用枚举器,可以迭代数组中的所有元素。
本章讨论如下内容:
简单数组。多维数组。
锯齿数组。array类。
数组的接口。
枚举。如果需要使用同一类型的多个对象,就可以使用数组。数组是一种数据结构,可以包含同一类型的多个元素。
在声明数组时,应先定义数组中元素的类型,其后是一个空方括号和一个变量名。例如,下面声明了一个包含整型元素的数组:
声明了数组后,就必须为数组分配内存,以保存数组的所有元素。数组是引用类型,所以必须给它分配堆上的内存。为此,应使用new运算符,指定数组中元素的类型和数量来初始化数组的变量。
下面指定了数组的大小。
提示:值类型和引用类型请参见第3章。
在声明和初始化后,变量myarray就引用了4个整型值,它们位于托管堆上,如图5-1所示。
警告:在指定了数组的大小后,如果不复制数组中的所有元素,就不能重新设置数组的大小。如果事先不知道数组中应包含多少个元素,就可以使用集合。集合请参见第10章。
除了在两个语句中声明和初始化数组之外,还可以在一个语句中声明和初始化数组:
还可以使用数组初始化器为数组的每个元素赋值。数组初始化器只能在声明数组变量时使用,不能在声明数组之后使用。
如果用花括号初始化数组,还可以不指定数组的大小,因为编译器会计算出元素的个数:
使用c#编译器还有一种更简化的形式。使用花括号可以同时声明和初始化数组,编译器生成的**与前面的例子相同:
数组在声明和初始化后,就可以使用索引器访问其中的元素了。数组只支持有整型参数的索引器。
提示:在定制的类中,可以创建支持其他类型的索引器。创建定制索引器的内容请参见第6章。
通过索引器传送元素号,就可以访问数组。索引器总是以0开头,表示第一个元素。可以传送给索引器的最大值是元素个数减1,因为索引从0开始。
在下面的例子中,数组myarray用4个整型值声明和初始化。用索引器就可以访问该数组中的元素。
警告:如果使用错误的索引器值(不存在对应的元素),就会抛出indexoutofrangeexception类型的异常。
如果不知道数组中的元素个数,则可以在for语句中使用length属性:
除了使用for语句迭代数组中的所有元素之外,还可以使用foreach语句:
提示:foreach语句利用了本章后面讨论的ienumerable和ienumerator接口。
不但能声明预定义类型的数组,还可以声明定制类型的数组。下面用person类来说明,这个类有两个构造函数、自动实现的属性firstname和lastname、以及tostring()方法的一个重写:
声明一个包含两个person元素的数组,与声明一个int数组类似:
但是必须注意,如果数组中的元素是引用类型,就必须为每个数组元素分配内存。若使用了数组中未分配内存的元素,就会抛出nullreferenceexception类型的异常。
提示:第14章介绍了错误和异常的详细内容。
使用从0开始的索引器,可以为数组的每个元素分配内存:
图5-2显示了person数组中的对象在托管堆中的情况。mypersons是一个存储在堆栈上的变量,该变量引用了存储在托管堆上的person元素数组。这个数组有足够容纳两个引用的空间。
数组中的每一项都引用了一个person对象,而这些person对象也存储在托管堆上。
与int类型一样,也可以对定制类型使用数组初始化器:
一般数组(也称为一维数组)用一个整数来索引。多维数组用两个或多个整数来索引。
图5-3是二维数组的数学记号,该数组有三行三列。第一行的值是和3,第三行的值是和9。
在c#中声明这个二维数组,需要在括号中加上一个逗号。数组在初始化时应指定每一维的大小(也称为阶)。接着,就可以使用两个整数作为索引器,来访问数组中的元素了:
提示:数组声明之后,就不能修改其阶数了。
如果事先知道元素的值,也可以使用数组索引器来初始化二维数组。在初始化数组时,使用一个外层的花括号,每一行用包含在外层花括号中的内层花括号来初始化。
提示:使用数组初始化器时,必须初始化数组的每个元素,不能遗漏任何元素。
在花括号中使用两个逗号,就可以声明一个三维数组:
二维数组的大小是矩形的,例如3×3个元素。而锯齿数组的大小设置是比较灵活的,在锯齿数组中,每一行都可以有不同的大小。
图5-4比较了有3×3个元素的二维数组和锯齿数组。图中的锯齿数组有3行,第一行有2个元素,第二行有6个元素,第三行有3个元素。
在声明锯齿数组时,要依次放置开闭括号。在初始化锯齿数组时,先设置该数组包含的行数。定义各行中元素个数的第二个括号设置为空,因为这类数组的每一行包含不同的元素数。
之后,为每一行指定行中的元素个数:
迭代锯齿数组中所有元素的**可以放在嵌套的for循环中。在外层的for循环中,迭代每一行,内层的for循环迭代一行中的每个元素:
该迭代显示了所有的行和每一行中的各个元素:
用括号声明数组是c#中使用array类的记号。在后台使用c#语法,会创建一个派生于抽象基类array的新类。这样,就可以使用array类为每个c#数组定义的方法和属性了。
例如,前面就使用了length属性,还使用foreach语句迭代数组。其实这是使用了array类中的getenumerator()方法。
C高级编程 第48章Syndication
其中onclick属性告诉运行库,在生成窗体的 模型时,把按钮的单击事件包装到triggerbutton click方法中。修改triggerbutton click 中的 注意标签控件类型是从 中推断出来的,所以可以直接在后台 中使用 下面准备运行它。不需要建立项目,只需保存所有的内容,把web浏...
C高级编程 第4章继
第3章介绍了如何使用c 中的各个类,其重点是如何定义方法 构造函数 属性和单个类 或单个结构 中的其他成员。我们指出,所有的类最终都派生于类,但并没有说明如何创建继承类的层次结构。继承是本章的主题。我们将讨论c 和。net framework如何处理继承。本章的主要内容如下 继承的类型。实现继承。访...
C高级编程 第3版
前言。对于开发人员来说,把c 语言及其相关环境。net framework描述为多年来最重要的新技术一点都不夸张。net提供了一种新环境。在这个环境中,可以开发出运行在windows上的几乎所有应用程序,而c 是专门用于。net的新编程语言。例如,使用c 可以编写出动态web页面 xml web服务...