|
|
|
|
移动端

2.7.2 数组的实例化和赋值

《C# 6.0本质论(第5版)》第2章数据类型,本章将探讨这些数据类型,更深入地研究字符串类型,并引入数组的概念。本节为大家介绍数组的实例化和赋值。

作者:周靖/庞燕 译来源:人民邮电出版社|2017-07-21 16:49

【新品产上线啦】51CTO播客,随时随地,碎片化学习

2.7.2 数组的实例化和赋值

声明数组之后,可以立即为其填充值。方法是在一对大括号中使用以逗号分隔的数据项列表。代码清单2-32声明了一个字符串数组,然后在一对大括号中指定了9种不同的编程语言的名称。

代码清单2-33 声明数组的同时进行赋值

  1. string[] languages = { "C#", "COBOL", "Java",  
  2. "C++", "Visual Basic", "Pascal",  
  3. "Fortran", "Lisp", "J#"}; 


在这个以逗号分隔的列表中,第一项成为数组的第一个元素,第二项成为第二个元素,以此类推。我们使用大括号来定义数组字面量。

只有在同一个语句中声明并赋值,才能使用代码清单2-33的赋值语法。如果在声明后赋值,则需要使用new关键字,如代码清单2-34所示。

代码清单2-34 声明后再进行数组赋值

  1. string[] languages;  
  2. languages = new string[]{"C#", "COBOL", "Java",  
  3. "C++", "Visual Basic", "Pascal",  
  4. "Fortran", "Lisp", "J#" }; 

自C# 3.0起,不必在new后面指定数组的数据类型(string),只要编译器能根据初始化列表中的数据类型推断出数组元素的类型。但是,方括号仍然不可缺少。

C#还支持将new关键字作为声明语句的一部分,所以允许像代码清单2-35那样的赋值和声明。

代码清单2-35 声明的同时使用new进行数组赋值

  1. string[] languages = new string[]{  
  2. "C#", "COBOL", "Java",  
  3. "C++", "Visual Basic", "Pascal",  
  4. "Fortran", "Lisp", "J#"}; 

使用new关键字会让“运行时”为数据类型分配内存。它指示“运行时”实例化数据类型——本例是一个数组。

只要将new关键字作为数组赋值的一部分,就可以同时在方括号内指定数组的大小。代码清单2-36演示了这个语法。

代码清单2-36 使用new关键字时可指定数组的大小

  1. string[] languages = new string[9]{  
  2. "C#", "COBOL", "Java",  
  3. "C++", "Visual Basic", "Pascal",  
  4. "Fortran", "Lisp", "J#"}; 

在初始化语句中指定的数组的大小必须和大括号中包含的元素数量相匹配。除此之外,也可以分配数组但不指定初始值,如代码清单2-37所示。

代码清单2-37 分配数组但不指定初始值

  1. string[] languages = new string[9]; 

分配数组但不指定初始值仍然会初始化每个元素。“运行时”将每个元素初始化为它们的默认值,如下所示。

引用类型(如string)初始化为null。

数值类型初始化为零。

bool初始化为false。

char初始化为\0。

非基础值类型以递归方式初始化,每个字段都被初始化为默认值。因此,在使用前不必须单独对数组的每个元素进行赋值。

注意

从C# 2.0开始可以使用default()表达式判断数据类型的默认值。default()获取数据类型作为参数。例如,default(int)返回0,而default(bool)返回false。

由于数组大小不需要作为变量声明的一部分,所以可以在运行时指定数组大小。例如,代码清单2-38根据在Console.ReadLine()调用中由用户指定的大小创建数组。

代码清单2-38 在运行时定义数组大小

  1. string[] groceryList;  
  2. System.Console.Write("How many items on the list? ");  
  3. int size = int.Parse(System.Console.ReadLine());  
  4. groceryList = new string[size];  
  5. // ... 

C#采取类似的方式处理多维数组。要以逗号分隔每一维上的大小。代码清单2-39初始化了一个没有开始走棋的井字棋棋盘。

代码清单2-39 声明二维数组

  1. int[,] cells = int[3,3]; 

还可以像代码清单2-40那样,将井字棋棋盘初始化成特定的棋子布局。

代码清单2-40 初始化二维整数数组

  1. int[,] cells = {  
  2. {1, 0, 2},  
  3. {1, 2, 0},  
  4. {1, 2, 1}  
  5. }; 

数组包含3个int[]类型的元素,每个元素都具有相同的大小。在本例中,这个大小是3。注意,每个int[]元素的大小必须完全一样。也就是说,像代码清单2-41那样的声明是无效的。

代码清单2-41 大小不一致的多维数组会造成错误

  1. // ERROR: Each dimension must be consistently sized.  
  2. int[,] cells = {  
  3. {1, 0, 2, 0},  
  4. {1, 2, 0},  
  5. {1, 2}  
  6. {1}  
  7. }; 

要表示井字棋棋盘,并不需要在每个位置都使用整数。另一个办法是为每个玩家都提供单独的虚拟棋盘,每个棋盘都包含一个bool来指出玩家选择的位置。代码清单2-42对应于一个三维棋盘。

代码清单2-42 初始化一个三维数组

  1. bool[,,] cells;  
  2. cells = new bool[2,3,3]  
  3. {  
  4. // Player 1 moves // X | |  
  5. { {true, false, false}, // ---+---+---  
  6. {true, false, false}, // X | |  
  7. {true, false, true} }, // ---+---+---  
  8. // X | | X  
  9. // Player 2 moves // | | O  
  10. { {false, false, true}, // ---+---+---  
  11. {false, true, false}, // | O |  
  12. {false, true, true} } // ---+---+---  
  13. // | O |  
  14. }; 

在这个例子中,棋盘被初始化,每一维的大小被显式指定。new表达式中除了指定大小,还提供了数组的字面量。bool[,,]类型的字面量被分解成两个bool[,]类型的数组,每个数组的大小都是3×3。每个二维数组都由3个bool数组(大小为3)构成。

如前所述,多维数组的每一维的大小都必须一致。我们还可以定义交错数组(jaggedarray),也就是由数组构成的数组。交错数组的语法稍微有别于多维数组。而且交错数组不需要具有一致的大小。所以,可以像代码清单2-43那样初始化交错数组。

代码清单2-43 初始化交错数组

  1. int[][] cells = {  
  2. new int[]{1, 0, 2, 0},  
  3. new int[]{1, 2, 0},  
  4. new int[]{1, 2},  
  5. new int[]{1}  
  6. }; 

交错数组不使用逗号标识新的维。相反,交错数组定义由数组构成的数组。在代码清单2-43中,int[]是数据类型,所以它之后的[]声明了一个int[]类型的数组。

注意,交错数组要求为内部的每个数组都创建数组实例。在这个例子中,我们使用new实例化交错数组的内部元素。如果遗失这个实例化部分,会造成编译时错误。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

.NET for Flash动态网站开发手札

本书深入浅出地说明了如何利用.NET、Flash及XML来辅助Flash富媒体应用程序的开发。 本书首先介绍了Flash影片应用程序与.NET应用程序结合的...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊