数组在 C# 中是如何工作的?
数组表示给定类型的固定数量的元素。元素存储在连续的内存块中,只要您知道元素的索引,就可以高效地访问元素。
声明和初始化数组的C#语法如下:
//创建一个字符串数组来保存5种语言 string[] languages = new string[3];
声明数组后,您可以使用数组上的平方表示法填充数组中的项。
languages[0] = "csharp"; languages[1] = "visual basic"; languages[2] = "f#";
但是,有一种替代的、简洁的语法可以将上述两个步骤合并为一个步骤。
string[] languages = new string[] { "csharp", "visual basic", "f#" };使用C#中的隐式类型变量,您可以去掉变量名左侧的类型而只使用var。
var languages = new string[] { "csharp", "visual basic", "f#" };您可以使用相同的平方表示法访问数组中的任何元素。
string language = languages[0]; Console.WriteLine(language); //printscsharp
数组的Length属性告诉我们该数组中有多少项。
int count = languages.Length; Console.WriteLine(count); //3
重要的是要记住,数组一旦创建就无法更改其长度。尝试访问数组边界之外的元素会引发异常。
string lang = languages[3]; //throwsSystem.IndexOutOfRangeException
如果要循环遍历数组,请使用该语言提供的for或foreach循环。
//forloop
for (int i = 0; i < languages.Length; i++){
string l = languages[i];
Console.WriteLine(l); //printsthenamesoflanguagesinsequence
}
//foreachloop
foreach (string l in languages){
Console.WriteLine(l); //printsthenamesoflanguagesinsequence
}默认值
创建数组时,C#编译器会将元素初始化为其默认值。例如,创建一个整数数组会将每个元素的值设置为0。
var numbers = new int[3];
foreach (int num in numbers){
Console.WriteLine(num); //prints000
}当元素属于值类型时,该类型的每个成员都被分配给它的默认值。
Point[] a = new Point[4];
int x = a[2].X;
Console.WriteLine(x); //prints0
public struct Point { public int X, Y; }但是,对于引用类型,编译器只是为每个项创建空引用。
User[] u = new User[4];
int y = u[2].Y; //NullReferenceexception
public class User { public int X, Y; }为避免该错误,您必须显式初始化每个项目,如下所示。
User[] users = new User[5]; for (int i = 0; i < users.Length; i++) //Iterateifrom0to999 users[i] = new User();
示例
using System;
class Program{
static void Main(){
string[] languages = new string[3]; //创建一个字符串数组来保存5种语言
languages[0] = "csharp";
languages[1] = "visual basic";
languages[2] = "f#";
string[] langugages_two = new string[] { "csharp", "visual basic", "f#" };
var languages_three = new string[] { "csharp", "visual basic", "f#" };
string language = languages[0];
Console.WriteLine(language); //printscsharp
int count = languages.Length; //3
Console.WriteLine(count);
//string lang = languages[3]; //throwsSystem.IndexOutOfRangeException
//forloop
for (int i = 0; i < languages.Length; i++){
string l = languages[i];
Console.WriteLine(l); //printsthenamesoflanguagesinsequence
}
//foreachloop
foreach (string l in languages){
Console.WriteLine(l); //printsthenamesoflanguagesinsequence
}
var numbers = new int[3];
foreach (int num in numbers){
Console.WriteLine(num); //prints000
}
Point[] a = new Point[4];
int x = a[2].X;
Console.WriteLine(x); //prints0
User[] u = new User[4];
//int y = u[2].Y; //NullReferenceexception
User[] users = new User[5];
for (int i = 0; i 输出结果csharp
3
csharp
visual basic
f#
csharp
visual basic
f#
0
0
0
0