你现在已经有了一维数组的基础,继续学习二维数组会更容易。
一、二维数组的应用
1表格和游戏中的网络地图,适合用二维数组表示
2许多经典游戏都建立在二维数组的基础之上(俄罗斯方块,数独)
二、了解二维数组分四步
1创建数组 int[,] array2d = new int[4,5]; //通常第一个数代表行,第二个代表列。
2填写数据 array[0,0] =1;
3修改数据 array[0,0] = 9;
4读取数据 Console.Writeline(array[0,1]);
三、二维数组的长度
我们知道,一维数组有一个长度,它的下标是用一个数字表示的。
而二维数组有行和列,那么它的下标就用两个数字表示
所以要分别获取两个维度的长度:
int[,] array = { {2, 3, 4} , {5, 6, 7} };
int 行数 = array.GetLength(0);
int 列数 = array.GetLength(1);
四、变量生命周期
1.什么是变量生命期?
一个变量在何时生,何时死?我们可以从具体例子入手。
先从函数参数讲起,我们在main函数中定义一个int值a = 3,同时在main函数之外定义一个函数Func,在Func函数中打印a+1,最后在main函数中调用Func函数。如图
static void Func(int a)
{
//a++;
a = a + 1;
Console.WriteLine($"Func a = {a}");
}
static void Main(string[] args)
{
int a = 3;
Func(a);
}
此时显然得到的答案是a = 4
那么如果在这时同时在main中直接打印a的值,会得到什么结果?
static void Func(int a)
{
//a++;
a = a + 1;
Console.WriteLine($"Func a = {a}");
}
static void Main(string[] args)
{
int a = 3;
Func(a);
Console.WriteLine($"main a = {a}");
}
你会惊讶的发现,结果是:
Func a = 4
main a = 3
这意味着从func函数回到main函数之后,a的值没有变化。
那么为什么会这样呢?
想要理解也很简单,首先,上述例子有所误导,我们适当改变原例
static void Func(int c)
{
//a++;
c = c + 1;
Console.WriteLine($"Func a = {c}");
}
static void Main(string[] args)
{
int a = 3;
Func(a);
Console.WriteLine($"main a = {a}");
}
我们可以清楚的看到Func函数中调用了main函数中的a的值并输出了Func函数中c的结果。
这个c并不是main函数中的a本身。
若把函数比作一个盒子,那么盒子里的参数什么时候创建,又是什么时候被销毁,这就是变量生命期的思想。
如上例,func函数每次执行都会先调用即创建参数3,并执行打印3+1的指令,随后就会被销毁。
因此,在main函数中,调用无数次func函数(a),结果之后会打印无数次的Func a = 4。同时由此可以推出,当int a = 3;执行时,main函数就创建了一个值为3 的参数,而当main函数执行完成后,参数随之销毁,这就是变量的生命期。我们所熟悉的for循环等局部变量,就是一个短暂的变量生命期。
2.把变量定义到函数之外
有一种特殊的情况是,我们可以把变量定义到函数之外。(以random为例)
static Random random = new Random();
如图所示的写法。可以使我们在任何其他函数中调用random变量。那么根据变量生命期的原则,我们需要讨论一个变量何时创建何时销毁,random这个变量会何去何从?
我们可以通过vs最左侧打断点的方式去观察并判断。
结果是当需要执行random函数时,将会创建random,但并不销毁,直到main函数运行结束后,销毁。
为何特殊,按照逻辑而言,既然random需要被每个函数调用,那么它应该最先创建才对,可是random却在第一次需要执行时才被创建,并只创建一次,直到程序结束后销毁。
这个就是函数之外的静态变量的生命期。
五、总结
理解变量的生命期,也就理解了代码的整体脉络。