## 变量
这一节会比较长,但这一节所介绍的东西,是一定要掌握的。
**请务必认真**
如果你想了解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] 公共变量在一帧执行完毕后,不会被销毁,它的值也会保留到下一帧。
>局部变量仅存在于某个函数内,当函数被执行完,它会立刻被销毁,不会存留到下一帧。
>
> **要注意,当编程块开始运行,里面的公共变量就会一直保存。
> 除非:
> 编程块被某个玩家点击了编辑脚本,然后再点击了保存。此时所有公共变量销毁。**
这也是一个让编程块销毁所有变量从头开始的方法,当编程块因为脚本原因在运行过程中报错,我们通常会点击编辑-》保存来对它执行这样一个 **初始化** 的操作。
- 序言
- 写在前面的话
- 太空工程师
- MEA小组
- 一、入门
- 1.1 基础概念
- 1.2 编程工具
- 1.3 变量
- 1.4 函数 Function
- 1.5 基本语法
- 1.5.1 运算符
- 1.5.2 if
- 1.5.3 for
- 1.5.4 其他语法
- 1.3 类 Class
- 二、编程块
- 2.1 方块的概念
- 2.2 List<T>结构
- 2.3 获取方块
- 2.4 方块的使用
- 三、Ship 类
- 3.1 简介
- Ship v0.5
- 代码
- 手册(待更新)
- 例子(待更新)
- Ship v1.0
- 代码
- 例子
- 文档
- 实例化
- 内置变量
- 内置方法
- Target类
- 四、运动控制算法在SE中的应用
- 4.1 运动控制介绍
- 4.2 过程控制
- 4.3 震荡和动态误差
- 4.4 误差累加方案
- 4.5 PID算法
- 4.6 对PID算法的一点点简化
- 4.7 一阶惯性系统的PID算法优化的研究
- 五、MEA方块类
- 5.0 核心代码目录
- v1.0核心代码
- v1.1 核心代码
- v2.0 核心代码
- 5.1 类的概念
- 5.2 MEA的方块类(Block)
- 5.3 方块类文档
- 5.4 方块类2.0 全教程
- 5.4.1 安装和使用
- 5.4.2 方块类(Block)
- 5.4.3 显示屏类(DisplayScreen)
- 5.4.4 LCD类(LCD)
- 5.4.5 主控座椅类(Cockpit)
- 六、疯猴的编程笔记
- 第一个程序
- 获取和控制其他块
- 物流与生产
- 界面与通信
- 运动与姿态
- 侦测与导航
- 七、SteamZhou的笔记
- 有趣而花里胡哨的IDEA
- 八、质子对撞炮的笔记
- 属性 Property
- 接口 interface
