以下问题与答案来自于真实求职,如有疑问请与本博客作者联系
- No1.值类型和引用类型的区别(答案为原创)
1 2 3 4 5
| 值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。 值类型的变量直接存储数据,分配在托管栈中。变量会在创建它们的方法返回时自动释放,例如在一个方法中声明Char型的变量name=’C’,当实例化它的方法结束时,name变量在栈上占用的内存就会自动释放
引用类型包括:数组,用户定义的类、接口、委托,object,字符串,null类型,类。 引用类型的变量持有的是数据的引用,数据存储在数据堆,分配在托管堆中,变量并不会在创建它们的方法结束时释放内存,它们所占用的内存会被CLR中的垃圾回收机制释放
|
- No2.Unity内置函数执行顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 1.Awake(用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用【此函数不可用来执行协程】) 2.OnEable(只有在对象是激活(active)状态下才会被调用,这个函数只有在object被启用(enable)后才会调用) 3.Start(脚本实例被启用时调用) 4.FixedUpdate(固定时间调用,常常用于物理逻辑的处理中使用,编辑器默认为50fps) 5.Update(每帧调用,默认为0.02) 6.LateUpdate(LateUpdate会在Update结束之后每一帧被调用,常用于第三人称视角相机跟随) 7.OnBecameVisible(用于当物体在/进入摄像机会调用一次) 8.OnBecameInVisible(用于当物体不在/离开摄像机会调用一次) 7.OnGUI(每帧会被调用多次(一般最低两次),布局Layout和Repaint事件会首先处理,接下来处理的是是通过 Layout和键盘/鼠标事件对应的每个输入事件) 8.OnApplicationPause(这个函数将会被调用在暂停被检测有效的在正常的帧更新之间的一帧的结束时) 9.OnDisable(当行为变为非启用(disable)或非激活(inactive)时调用) 10.OnDestroy(物体删除时调用) 11.OnApplicationQuit(这个函数在应用退出之前的所有游戏物体上调用)
|
- No3.链表和数组的区别,每个的优缺点(答案为原创)
1 2 3 4 5 6 7 8 9 10 11 12
| 1.区别: (1)由于数组的存储内存时连续分配的,当数组长度在使用过程中增加长度,会导致数组变量被覆盖,所以数组的元素是固定的,而链表的存储方式是链式存储,组成链表的结点个数可以根据实际需要进行增减 (2)数组的存储单元在数组定义时就需要分配,而链表是由结点组成的,前一个结点指向后一个结点存储地址,再程序的执行过程中结点的存储单元可以动态分配 (3)数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系由结点所包含的指针来体现 (4)在实际的使用过程中难免遇到便是对数据的增删操作,对于在数组中插入数据则需要对从插入位置开始后面的数据后移,而链表由结点组成,每一个结点包括本身信息的数据域和指向下一个结点存储地址信息的引用域,当向某n位置插入数据时,则仅需将n-1位置指向新插入的结点,将n结点的next指向原先的结点,当删除n位置结点时,则仅需将n-1指向n+1即可 2.数组和链表的优缺点 (1)优点 数组:随机访问性强,查找速度快 链表:插入删除速度快,内存利用率高,不会浪费内存,大小不固定,扩展灵活 (2)缺点 数组:插入和删除效率低;可能浪费内存;内存空间要求高,必须有足够的连续内存空间。;数组大小固定,不能动态拓展 链表:不能随机查找,必须从第一个开始遍历,查找效率低
|
- No4.Unity为什么能实现跨平台
1
| Unity 的跨平台即是基于Mono,开发时的写的各种类型的脚本语言(C#、JavaScript...) 都会被 Mono 的编译器编译为 IL,然后在各个平台上的 Mono 虚拟机上运行,这样就实现了跨平台的机制
|
- No5.面向对象编程的三个特点
1 2 3 4
| c#面向对象编程的三大特性:继承,封装,多态 继承:是指在确定系统的某一部分内容时,应考虑到其它部分的信息及联系都在这一部分的内部进行; 封装:让某个类型的对象获得另一个类型的对象的属性和方法。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行; 多态:对于同一个行为,不同的子类对象具有不同的表现形式多态存在的3个条件:【1)继承 2)重写 3)父类引用指向子类对象】;
|
- No6.三次握手和四次挥手
1 2 3 4 5 6 7 8 9
| 1.三次握手 (1)第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_Send 状态。 (2)第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。 (3)第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。 2.四次挥手 (1)第一次挥手:主机1(可以是客户端也可以是服务端)向主机2发送一个终止信号(FIN),此时,主机1进入FIN_WAIT_1状态,他没有需要发送的数据,等待着主机2的回应; (2)第二次挥手:主机2收到了主机l发送的终止信号(FIN),向主机1回应一个ACK,收到ACK的主机1进入FIN_WAIT_2状态; (3)第三次挥手:在主机2把所有数据发送完毕后,主机2向主机]发送终止信号(FIN),请求关闭连接; (4)第四次挥手:主机1收到主机2发送的终止信号(FIN),向主机2回应ACK 然后主机1进入TIME_WAIT状态(等待一段时间,以便处理主机2的重发数据)。主机2收到主机1的回应后,关闭连接.至此,TCP的四次挥手便完成了,主机l和主机2都关闭了连接。
|
- No7.装箱和拆箱
1 2 3
| 装箱:值类型转换为引用类型 拆箱:引用类型转换为值类型 需要注意:任何称之为类的类型都是引用类型,使用class修饰,所有值类型都成为结构或者枚举,用struct/enum修饰
|
- No8.碰撞器和触发器【基础】
1
| 碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
|
- No9.有两个接口IA和IB,他们中有一个同名方法Test() 一个类同时继承这两个接口,应该如何处理他们的同名方法?(参考自唐老狮模拟面试分享)
1 2 3
| 答案:显示实现接口 IA.Test() IB.Test()
|
- No10.请说明C#中的List是如何扩容的(参考自唐老狮模拟面试分享)