企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 变量 这一节会比较长,但这一节所介绍的东西,是一定要掌握的。 **请务必认真** 如果你想了解C#的详细语法,网络上可以找到 [丰富的资源](http://www.runoob.com/csharp/csharp-tutorial.html)。 本节所述的内容,也足够保证你在太空工程师编程块的脚本编写中够用。 ### 一、变量的声明 变量是几乎所有编程语言中共通的概念。 >[danger] 要注意,C#是一种大小写敏感的语法。它是区分大小写的,所以在后面请一定注意大小写的区别。 你可以这样理解:变量是一种你可以凭空创造的记忆体,你可以将数据存放在其中,当你需要的时候,你只需要召唤这个记忆体即可。 变量是有类型的,当你凭空创造一个变量的时候(声明变量),你必须确定它的类型。 ~~~ int a; double b; //其中double是它的类型,b是它的名字。 ~~~ 在一个变量被声明以后,你就可以对它进行**赋值**。 >[danger] 记住,只有在声明的时候需要在它前面写上类型。之后的访问和赋值都不需要再写它的类型。 >你可以理解为,一旦在变量名前面加了类型,就表示你在声明它。 ~~~ int a = 5; //其中int是它的类型,a是它的名字,5是它的值 double b = 2.333; //声明变量b同时赋值 b = 6.666; //然后修改变量b的值,即重新赋值 string MyName = "MEA"; //string类型的变量的值必须加双引号 char MyKey = 'a'; //字节类型变量是单引号,这个不常用可以先不了解 ~~~ 常用的变量类型有 **整型 int、浮点小数 float、双精度小数 double、字符串 string、布尔 bool等**,这些是变量的**基本类型**,需要背下来。其中布尔变量是一种只存在两种值的变量,true或者false。 ~~~ bool isRight = true; isRight = false; ~~~ >[danger] 在某些语法中,变量的类型可以灵活变换,不要求声明变量的时候确定它的类型,我们称之为弱类型的语法,例如PHP。**C#是一种强类型的语法,它对变量的类型有严格的要求,在声明变量的同时,必须确定它的类型。当一个变量被声明了以后,它的类型不可以再改变,同样的,你也不可以将其他类型的变量赋值给这个变量。** 下面我们来看一个例子: ~~~ int a = 5; int b = 6; bool isRight = false; if(a*b <= 30){ isRIght = true; //如果a*b小于或等于30,isRight被重新赋值为true } ~~~ ### 二、变量的作用域 在同一个作用域中,不同变量是不可以重名的 ~~~ int a = 5; int a = 6; //本行编译不通过 ~~~ 这样的写法会编译失败。虽然变量名可以自己定义,可以写得很长,但在一些庞大的系统中,很难保证变量的名字不产生重复。所以变量是有作用域的。 我们可能会看到这样的写法 ~~~ int a = 5; void Main(){ int a = 6; } //void Main(){}是一个函数,或者说一个方法。 ~~~ 这个写法并不会编译失败,C#的规范允许这样的写法。原因就是变量存在作用域。上面的例子中,写在函数Main()外面的变量int a的作用域在Main()函数外,可以看做一个全局变量。在函数Main()里你可以使用它。 ~~~ int a = 5; void Main(){ Echo(a); //打印变量a,显示5 } ~~~ 但如果你在Main()函数中又声明了一个变量int a,此时Main()里的a将不会和外面的a一样。 ~~~ int a = 5; void Main(){ int a = 6; Echo(a); //打印变量a,显示6 } Echo(a); //打印变量a,显示5 ~~~ 实际上在某个函数中,当你声明了一个变量,它与某个函数外的公共变量名字重复时,系统会立刻自动创建一个新的变量int a,接下来你在这个函数中访问变量a,实际上访问的是这个新变量。当程序执行到这个函数的最后一行,即跳出函数后,这个函数内的新变量a会自动销毁。之后你再访问变量a,依然访问到的是最开始的公共变量a。 所以我们可以把变量分为两种,公共变量、局部变量 >[danger] 1. 在函数外声明的变量,就是公共变量,它的作用域与函数平级,同级中的所有函数都可以访问到它。 >2. 在函数内声明的变量,就是局部变量,它的作用域仅存在于这个函数内部,在函数外的区域或其他函数中无法访问到它。 >3. 当在函数内声明了一个变量,并且它与外部的公共变量重名时。在这个函数内访问这个变量,访问到的都是这个新的局部变量,对它进行赋值或访问都不会影响外部的同名变量。 说到这,我们终于可以将变量赋值的规则了。 在编写脚本时,你可能会看到这种写法 ~~~ int a; void Main(){ Echo(a); //打印a,显示0 } ~~~ 明明没有对变量赋值,为什么它会是0呢?因为 **公共变量可以在声明的同时不赋值,如果省略赋值,系统会将它赋予默认值。** **int、double、float默认是0,bool默认是false,其他非基本类型的变量默认值是null** **局部变量在声明的同时必须赋值** ~~~ void Main(){ int a; //本行代码无法通过编译 a = 5; } ~~~ 顺便介绍一下如何同时声明多个变量 ~~~ int a, int b, int c; //只有公共变量可以这样 ~~~ ### 三、其他变量类型 除了上面所述的几种基本变量类型,你还可能接触到 ~~~ Vector3D MyPosition; //坐标类型 Color MyShipColor; //颜色类型 IMyThrust Thrust; //推进器方块类型 ~~~ 这些也是变量,但它的类型并非基本类型。实际上,在C#中,每一种变量类型都是一个类(class),这部分内容我们在后面讲解。 ### 四、变量在编程块中的留存机制 编程块中的脚本默认是在点击运行以后执行一次的。但我们通常需要让它一直运行。 ~~~ //设置程序自动开始运行 public Program(){ Runtime.UpdateFrequency = UpdateFrequency.Update1;//激活自触发 } ~~~ 可以把上面这段代码当做一个函数,复制到公共区域,并不需要在Main里调用它,只需要放进去即可。它能让编程块在点击保存代码的一瞬间就开始自动执行,并在执行完一次后立刻从头开始执行下一次循环。循环的速度是60次每秒,这也是编程块最高循环速度。 这意味着,每一秒,编程块里的代码都被从头到尾执行了60次。 为了方便描述,我们把每次执行叫做一帧。 如果一个变量我们需要在这一帧改变它的值,并在下一帧继续使用它,就必须把它作为一个公共变量。 >[danger] 公共变量在一帧执行完毕后,不会被销毁,它的值也会保留到下一帧。 >局部变量仅存在于某个函数内,当函数被执行完,它会立刻被销毁,不会存留到下一帧。 > > **要注意,当编程块开始运行,里面的公共变量就会一直保存。 > 除非: > 编程块被某个玩家点击了编辑脚本,然后再点击了保存。此时所有公共变量销毁。** 这也是一个让编程块销毁所有变量从头开始的方法,当编程块因为脚本原因在运行过程中报错,我们通常会点击编辑-》保存来对它执行这样一个 **初始化** 的操作。