#前言
哈喽哈喽,我来了。
本文将结合C#在Unity中的应用讲解,代码编辑器使用Visual Studio。讲解内容来自《C#高级编程 第10版》和我的理解,如果有错希望大佬指出(骂我,不要客气!)。
下面是《C#高级编程 第10版》的pdf文件分享
#正文
#变量
- 变量的基础介绍
int
a
;
//其中a就是变量。int是数据类型,代表a用于存放整数。
a
=
0
;
//a的初值被赋值为0。初值:初次被赋值的值。
a
=
1
;
//此时a的指变为1。变量变量,因为可以变所以是变量。
a
=
a
-
1
;
//a的值变为0。因为之前a的值为1,所以a - 1就相当于 1 - 1。
变量即变化的量,用于存储数据,方便之后使用。
变量就好比一个只能放一个物品的篮子,每次放入物体后就需要拿出前面的物体,因为这个篮子只能放一个物品。在使用变量时就相当于直接把这个篮子给它丢上去,里面装的啥,这次使用的时候就相当于啥。
变量使用前必须要初始化,不然要不会报错,要不答案会不和你的心意。(你都定义变量了,为什么不赋值!)
- 变量的作用域
Class A
//这是类,我们之后在讲哈
{
int
a
;
//变量a的作用域是整个A这个类,所有A内的函数都可以给它赋值和使用它。
void
Fun
(
)
//这是函数,我们也之后在讲哈
{
int
b
;
//变量b的作用域是整个函数中,函数以外的地方不能使用它。
}
//函数以花括号为结尾
//这里使用b的话就会报错
}
在同一作用域里,不能重复声明一个变量(也就是不能有两个名字一模一样的变量)。
还是以装东西的物品举例吧,超市的推车(只能装一个东西的推车!好小的推车),你在超市里拿了,只能在超市中使用。变量也是同理,你在类里面声明了,那么你就只能在类里面使用,外面就不行。
原则上来说,尽可能不使用相同命名的变量,但不同作用域里是可以声明和外部相同名字的变量的(使用时,使用你命名的局部变量),比如你在继承了MonoBehaviour类(Unity内代码都继承自这个类)里面定义一个gameObject,可以正常使用这个新的变量,但编辑器会给你来根黄色波浪线提示。还是要避免这种情况!
- 常量
const
int
a
=
100
;
//const是关键字,后面声明的不再是变量,而是一个常量。a之后就只能为100了。
通过以上方式声明的常量,就可以理解为一个不能变化的变量,常量是在生命周期(声明到销毁的过程中的时间内)里值不会发送变化的变量。常量在声明时就需要赋值,不然会报错。(常量了解一下就好,很少去声明一个常量的。)
其他的,比如100,0.1f(f表示浮点数)之类的有个定值的,不能改变的,也都是常量。
#数据类型
- 值类型和引用类型
C#的数据类型分为值类型和引用类型:值类型存储在堆栈中(堆栈以后会讲哦),而引用类型存储在托管堆上。
我们接下来要讲的基础数据类型(int,float)这些都是值类型哦,虽然string是引用类型,但使用方法和值类型没什么区别。新人读者不需要太纠结于值类型和引用类型,在之后讲到类之后,我会再次详细讲一遍值类型和引用类型的区别和使用方法。
关于string是引用类型的证明,大家可以参考下面这篇文章
- 基础数据类型
首先是整型(下图是截取自《C#高级编程 第10版》):
平时都是使用int类型哦,但要注意你会使用到的变量范围,如果超过了最大值或者低于最小值,记得要换成long。
然后是浮点类型(下图是截取自《C#高级编程 第10版》):
其实浮点数也就是我们说的小数,只是说法不一样罢了,以后大家听到程序员说浮点数要一下子反应过来哦。一般开发中使用float就够了。
因为二进制存储小数会产生误差,所以大家使用浮点数计算要注意哦,但也无需太在意,一般项目没这么高要求,如果有要求一开始就会说的。(考大家一下,现在大家都知道了浮点数用于计算有误差,但银行的存取过程中可不允许产生误差哦,大家想想银行一般是怎么处理的呢,有兴趣的可以百度看看。)
decimal类型是精度更高的浮点数,书中介绍说是一种专用类型进行财务计算的。我没有使用过,大家以后需要进行这类计算的时候可以来看一下这个类型,这个类型并不是基础类型。
float
a
=
1.0f
;
//其中的f表示该
bool类型(下图是截取自《C#高级编程 第10版》):
bool类型就两个值哦,一个是true,一个是false。(C#里面无法将整数类型隐式转换为bool类型,在别的语言比如Java里面是可以的,转换时0表示false,非0为true。)
bool
a
=
true
;
bool
b
=
false
;
字符类型:
用于存储单个字符的值。(这个虽然是基本数据类型,但基本用不到,除了你学校的考试,基本上没必要写。)
char
a
=
'A'
;
- 预定义的引用类型
object类型
根类型,其他类型都是从它派生出来的(包括值类型)。这是个概念性的类型,object类是所有类的最上级,在封装类的时候很可能用得上。
string类型
string类型中放的是字符串,也就是文字啦。这里有一个重要的知识:string类型的字符串是无法改变的,每次你给string类赋值的时候,其实就是生成了一个新的字符串,然后放到字符串变量里(引用的),原来的字符串就等待被毁掉了。
string
a
=
"这里是中文!"
;
string
b
=
"lalalalal"
;
//也可以放英文,所有打的出来的字符都可以哦,其中还有转义字符,会变成相应的效果,有兴趣百度吧。
a
=
a
+
b
;
//a的原来的字符串直接被丢掉,生成一个新的字符串,放入变量中。
#程序流控制
众所周知,正常来说一个程序段里面的代码,应该是从上往下的,执行完上一句然后执行下一句,但程序流控制语句会有些例外哦。
- 条件语句
也叫if语句,用if...else...的结构,直接看代码,代码会更清楚。
bool
a
=
true
;
if
(
a
)
//括号里的只能是bool类型。意思是说,如果这个判断是对的,执行下面的语句。
{
//当a为true时,执行这个语句块的代码,然后跳过后面所有的判断
}
else
if
(
a
)
//括号里还是只能放bool类型,而且else if可以写无数个。意思就像是说,如果不符合上一条判断就判断它是不是符合这个判断。
{
//上面是true就执行这个代码
}
else
//意思是,如果不符合上面任何一种判断,就直接执行下面语句块中的代码。
{
}
- switch语句
还是直接上代码。
switch
(
a
)
//a可以是整型变量和字符串(string变量),还有字符变量(char)
{
case
1
:
//意思是,判断a是不是等于1,如果等于1就执行下面的内容。
//执行的代码
break
;
//意思是跳出循环语句,也就是switch语句块,不执行下面的语句了。
case
2
:
//执行的代码
break
;
……
default
:
//当以上判断都不正确时,调用下面的代码。
//执行的代码
break
;
}
switch
(
a
)
//a可以是整型变量和字符串(string变量),还有字符变量(char)
{
case
1
:
//意思是,判断a是不是等于1,如果等于1就执行下面的内容。
//执行的代码
break
;
//意思是跳出循环语句,也就是switch语句块,不执行下面的语句了。
case
2
:
//执行的代码
break
;
……
default
:
//当以上判断都不正确时,调用下面的代码。
//执行的代码
break
;
}
- for循环
多说无益,直接看代码,虽然想这么说,但还是先看图吧,更加直观些。
其中的i 的意思可以粗略的理解为i = i + 1;(还有个 i;本质上都是一样的,让 i 加 1 但执行时间不一样,平时写代码一般都是写一个i++就得了,只有考试才会问你这两个有啥区别之类的,如果有需要就百度看看吧,很简单的。)
还有诸如 i += 1;这样的代码,其实这个+=就想当于使用原本的变量加上某个数值,在赋值给原来的变量,是一种简写,当然,这与i = i + 1;是有区别的,但在平时项目中无需关心,也就是个知识扩展的感觉罢了,有兴趣就百度吧。
for
(
int
i
=
0
;
i
<
100
;
i
++
)
{
//执行的代码
}
以上代码就表示执行语句块的内容100次,逻辑参考上面的图。新人的话可能有些懵逼,为什么要执行一个语句块一百次呀!这些疑问很快就能在后面的学习里找到答案哦。
- while循环
先看逻辑:
再看代码
while
(
a
)
//a代表bool类型,不一定是变量。1 == 1也是逻辑判断true,这样也可以
{
//执行语句
}
不同于for语句一般有固定的次数,while语句只要a的值一直为true就可以一直循环。不过还是要在语句块中写下可以跳出循环的条件,使用break;或者使a变为false,死循环程序是会崩掉的。
- do...while
上图!
上代码!
do
{
//执行的代码
}
while
(
a
)
;
//注意这个分号,要记得写do
从上面的流程图可以看出来,do...while和while语句很像,就是在开始前多执行了一次。因为do...while的语句后面才执行判断,所以一定会被执行一次。(一般用while就解决了,do...while的登场率不算高吧。)
- foreach循环
接下来的解释对于新人来说不太友好了。foreach循环用于循环数组,集合类这些组合类型的情况,每次循环取出一个其中的一个子物体,进行操作,循环次数是集合中的物体数量。(能用foreach的场合都可以用for解决,而且foreach的性能消耗比for更高,但一般也不会考虑这点性能啦,大家想用还是可以放心用。)
foreach
(
int
temp
in
intarray
)
//intarray是数组哦。
{
//执行的代码
}
数组,集合以后都会讲的,听不懂的也没关系,后面就懂了。
- 跳转语句
1.goto语句
其实我在思考要不要把这个加进来的,这个goto语句可以说是臭名昭著,几乎没人使用它,使用可能会引发各种各样的问题。我就不详讲了,只是跟大家提一嘴,让大家知道有这么个不受待见的goto语句。
2.break语句
之前的代码里就使用过这个语句,这个语句用于跳出当前循环,是直接跳出循环,直接执行后面的语句。
3.continue语句
用法和break语句一样,直接一句
continue
;
这样就可以了。
意思是跳过本次循环,进行下一次循环。它并不像是break一样直接跳出全部循环,而且只有当前这次循环后面的内容被跳过,进行下一次的循环。
4.return语句
这个我们留到讲方法和类的时候讲,现在讲需要扩展的内容就太多了。