#前言
来了来了,距离上次更新已经十几天了,不过上次是上周一更新的,这次我抓住一周的尾巴更新,也不算托更了吧(一周至少一更)。
本文将结合C#在Unity中的应用讲解,代码编辑器使用Visual Studio。讲解内容来自《C#高级编程 第10版》和我的理解,如果有错希望大佬指出(骂我,不要客气!)。
下面是《C#高级编程 第10版》的pdf文件分享
#正文
#类
C#是面对对象的程序设计语言,面对对象的程序设计的语言有四个基本特点:抽象,封装,继承和多态。这里面的每一个都离不开类,可见类是多么的重要。
我们看一下抽象的概念:在面向对象的程序设计中,每一种事物都可以成为“对象”。把一个事物对象的特点概括表示出来的过程叫做抽象。
对象相当于是使用类为模板创建出来的,比喻一下就是:
一个学生就是相当于一个类,他有学号,有姓名,有班级,有座位号,还有人类的特征,两个眼睛一个鼻子等。但它却不是一个特定的存在,一个学生它只是一个概念,一个模板。如果这个时候我试图找到这个学生概念来帮我打扫一下卫生什么的,显然是不可能的,因为他并不是实际存在的学生(对象)。
学生A就是一个对象,他有固定的学号,固定的姓名等,我完全可以通过他得到他的学号,班级这些,信息,需要他打扫卫生的时候,也完全可以把他揪出来。
学生A是参照学生模板制作出来(当然现实生活中不是学生模板制作的)的。对象也是这样,依照类模板制作出来,类中没有被赋值的概念数值,在对象中被赋值,我们平时使用的一般都是对象。当然,并不是说类不能被使用,就像是所有学生都是地球人一样(除了异世界),我们还是可以直接从学生这个概念里拿出 星球:地球 这样的数值的,这也就是待会要讲的静态变量。
那么我们先来看一下类的成员吧:(下图是截取自《C#高级编程 第10版》)
索引器吗,运算符,事件等后面这些我们都留到之后再讲。
-
字段
字段其实就是类里面的变量。
class
MyClass
{
int
a
;
GameObject
b
;
//使用前要赋初值哦。
}
这里用到的GameObject是Unity里的非常常用的类,之后要是讲到Unity内的编程咱们在详细讲。
C#规范的代码的类应该是首字符大写的,大家命名的时候要注意,变量的命名应该首字母小写,方法的命名应该是首字符大写的。这是前人约定的,大家也都遵守,这样可以增加代码的可读性,可以让下一个读代码的可以快速读懂。(客官,你也不想之后有人看你的代码的时候边看边骂吧。)
-
方法(我决定把方法放在属性前面讲)
大部分的代码都是写在各个方法里的,程序就是通过调用一个个方法最后实现功能的。
1.方法的声明
【访问修饰符】 返回类型 方法名称 (【参数】)
{
//方法的主体,在这里写代码
}
public
float
MyFun
(
int
a
)
{
return
0.1f
;
}
下面我们挨个介绍
首先是访问修饰符:
有三种访问修饰符:public, protect, private。public:公有,所有类的访问它。protect:它本身以及何其有继承关系的类可以访问它。private:只有这个类本身可以访问它。
我为什么要使用它而不是方法呢,因为在字段和属性中也可以使用访问修饰符,像我上面没有写访问修饰符就声明的字段,其实是默认有private修饰符,同样方法也一样,如果没有写就是private。
(我思考了一下,发现文字是有局限的,访问修饰符的区别的最好是在代码中去体验。)
返回类型:
返回类型可以是所有基础数据类型,也可以是类和结构体。
返回类型就是在告诉使用人:喂,这个方法里的代码运行一圈之后会返回一个这个数据结构的变量。所以说,我们需要使用return来返回这个数据类型的变量。(上面的0.1f表示这是个float类型的0.1,因为C#里小数是double类型的。)
返回类型中还有一个void类型,这个表示这个函数是没有返回值的,这里仍然可以使用return,这是的return后面直接接分号,表示跳出这个方法,不执行方法后面的代码了。
这种没有返回值的函数有神马用啊?
问的好,实际上这种没有返回值的方法比有返回值使用的更加频繁,因为方法中可以处理这个对象中的属性变量呀。
方法名称:
不用多说,大家只要记得C#的方法命名应该首字母大写就好了。
参数:
用于数据的传入,就是在调用方法的时候需要传递这个数值进来,方便代码里的数据进行运算。这里的参数可以是类和结构体。
这里的参数可以提前赋值哦。
public
float
MyFun
(
int
a
=
1
)
{
return
0.1f
;
}
在调用是我可以不放入参数,这是调用方法就会默认你是放入了1为参数,开始调用方法。
2.方法的重载
class
MyClass
{
private
void
MyFun
(
)
{
}
private
void
MyFun
(
int
a
)
{
}
}
以上这种情况就是方法的重载,两个方法虽然名字一样,但参数不同。这里要注意,只有参数不同的情况下才叫做重载,返回值不同参数相同的情况下会报错(你想想如果这样我调用的函数的时候,电脑怎么知道该调哪一个函数呢)。
方法的重载很常见的,那些你常用的Unity自带的方法,很多都是有重载的。如果你需要买一样东西,你既可以通过名字去找到这个东西,也可以通过外形去找到这样东西,这就很像重载。(你当然可以将她们命名成为两个方法,但你想想你做为一个学习的人,是愿意记住一大堆名字的函数,还是愿意去记一个函数(编辑器可是会提醒你方法内需要的参数的))
3.个数可变的参数
public
void
AnyNumberOfArguments
(
params
int
[
]
data
)
{
foreach
(
var
x
in
data
)
{
//WriteLine(x); 控制台应用程序输出
Debug
.
log
(
x
)
;
//Unity内输出到console
}
}
上面的函数意思是:可以放入任意数量的int类型,随后这些int参数会统一放入一个int数组,代码内容则是遍历数组并打印其中每一个数字。
有一说一,没怎么用过,如果不是刚刚看了书,我都忘了还有这个,哈哈哈。
-
属性
属性的概念是:它是一个方法或一对方法,在客户端代码看来,它(们)是一个字段。(来自《C#高级编程 第10版》)
属性的使用与字段有很大的关系,但属性的本质是方法,所以放在方法后面讲我认为更加合理。
出于封装的思想,一般情况下应该把字段直接声明为public公有,大多数情况下是private私有。那么我们该怎么修改和获取这些字段呢,对,我们可以通过命名pulic的方法,在方法内去修改那些私有变量。(对新人可能有点绕,方法本身就在类里面,所以可以在方法里使用类的私有字段。)
在JAVA中,在命名了私有字段后又希望外面可以修改这个字段,往往会写一个Get字段名(),Set字段名(),两个函数,通过这两个函数来修改这个字段。
C#比JAVA晚出来,可能考虑到每次写两个方法很麻烦,于是设置了一个属性的概念。
class
MyClass
{
private
int
myInt
;
public
int
MyInt
{
get
{
return
myInt
;
}
set
{
myInt
=
value
;
}
}
}
注意属性的首字母大写,并且也该和它使用的字段一样的名字,除了首字母大写。
虽然属性本质是方法,但在使用中我们却是把它当成字段使用。
int
a
=
MyInt
;
MyInt
=
1
;
//就像MyInt(1)一样,当然你不能当成方法写成这样
public
int
MyInt
{
get
;
set
;
}
上面这种写法等价与上面的声明方式,算是简写,大家以后看到了别困惑。
-
构造函数
在实例化对象时,就会调用类的构造函数,先来看看构造函数的结构。
class
MyClass
{
public
MyClass
(
)
{
}
public
MyClass
(
int
a
)
{
}
}
首先构造函数是特殊的方法与方法结构类似,不过它没有返回值,而且它的名称需要与类名一样,怎样才能便鉴别为构造函数。
类是一定要有一个构造函数的,如果没有在类里面声明构造函数,那么会生成一个无参的构造函数,它什么都不会做,只是需要一个构造函数所以在那。
在Unity内,一般不会去声明构造函数,用的比较少。
构造函数的内容不多,差不多理解为特殊的函数就可以了,需要注意的是使用静态声明的构造函数。就是前面加一个static,这种构造函数只执行一次,用于初始化一些静态字段。这种静态构造是C#自己处理运行的,你无法知道是什么时候它会被调用,但它总会你在你使用类之前完成调用。(因为静态字段本就可以赋初值,会不会那个赋初值的操作和这个静态构造函数有关呢,谁知道的告诉我一下。不过有一点可以确定,因为可以直接给静态字段赋初值,所以其实没什么必要直接去写静态构造函数。)
#结构
结构与类十分相似,有字段也可以命名方法,比起讲结构我们更应该关注两者的区别,以便与使用。
-
结构不支持继承。
-
对于结构,构造函数的工作方式有一些区别。如果没有提供默认的构造函数,编译器会自动提供一个,把成员初始化为其默认值。
-
使用结构,可以指定字段如何在内存中布局。(这段来自《C#高级编程》)
其实吧,最后一个区别我也不知道,没用过,书中说16章会说,那我们到时候在学吧。
上面说了这么多,如果反应到使用中,就是一般情况下,只有字段,字段是基本数据结构,不含有或者还有一两个函数方法的时候,使用结构(一般都是不含函数方法的),其他时候使用类。因为结构是值类型,在字段的使用上更加节省空间和时间。
struct
MyStruct
{
public
int
a
;
public
string
b
;
}
结构不是为继承设计的,但结构与类一样,都是继承自System.Object。结构是继承自System.ValueType,System.ValueType又继承自SyStem.Object。继承咱们还没讲,看不懂也莫得关系。
还有就是不同于类的构造函数,结构的默认构造函数会把字段赋初值。不过也不用关心,因为你使用结构前应该给结构里的值先进行赋值,不然也得不到你想要的结果。
#结束语
-
建议
其实我讲的内容是简化的,很多地方可能还没有讲清楚。如果大家哪里没有看懂,可以去翻看一下《C#高级编程 第10版》,如果还是没有搞懂,欢迎在评论区询问,我会尽力回答的。以上提到的内容都是基础中的基础,是绝对不允许出现不理解的情况的。
如果害羞不好意思在评论区询问,欢迎大家加我QQ来讨论哦。QQ:2243211562
-
杂谈
挺困难的,说真的挺困难的。可能是我语文功底太差,有些内容如果想讲清楚可能要花费极大的笔墨,而且还不定能让别人看懂……
所以说!代码还是要敲出来的,光听讲是不行的!(当然可能只是我讲的烂。)所以我决定还是要扩展阅读和正式的交叉更新(当然还是一周一更),在扩展阅读里我会讲有些我在正式里没有提到的内容,如果我会去找一些题,用于练习,通过敲代码给大家带来更加直观的理解。
日复一日,必有精进。
这篇文章就到这里了,大家再见。
1205

被折叠的 条评论
为什么被折叠?



