1.装箱和拆箱是指什么?
装箱——把栈中内容迁移到堆中去(值转引用)
拆箱——把堆中内容迁移到栈中去(引用转值)
2.值和引用类型在变量赋值时的区别是什么?
值类型:赋值时复制数据本身,每个变量拥有独立的数据副本,修改一个变量不会影响到其他变量。
引用类型:赋值时复制引用,多个变量指向同一个数据对象,修改一个变量会影响到所有指向同一数据对象的变量。
3.委托和事件在使用上的区别是什么?
- 委托可以直接调用被引用的方法,而事件只能通过发布者来触发。
- 事件隐藏了委托的细节,提供了更加安全和易用的订阅和取消订阅接口。
- 事件相对委托来说,事件在外部使用时只能 +=、-=。
4.有两个接口IA和IB,他们中有一个同名方法Test()一个类同时继承这两个接口,应该如何处理他们的同名方法?
IA.Test();IB.Test();
5.请说明C#中的List是如何扩容的
list的本质是动态数组,当创建时会有一个初始容量,如果当前的容量不足以容纳新元素,就会创建一个容量翻倍的数组将原始数组中的元素复制到新的数组中去。
6.Unity中点乘和叉乘对于我们来说的作用是什么?
点乘用来判断一个点的大致方位以及计算两个向量之间的夹角
叉乘用来判断两个向量的左右关系以及平面的法向量
7.请简述Unity中协程的原理
Unity中的协同程序分为两部分
1.协程函数本体(迭代器函数)
2.协程调度器(协程管理器)
协程利用迭代器函数的分步执行的特点
加上
协程调度器对迭代器函数们进行统一管理
根据迭代器函数的返回值来决定下一次执行函数逻辑的时间点
从而实现逻辑分时分步执行的目的
8.Unity底层如何处理C#代码?
1. Mono
概述:
Mono 是 Unity 早期使用的运行时环境,也是一个跨平台的开源项目,提供了一套完整的实现了 .NET 标准的运行时环境和类库。
Unity 使用 Mono 来解释和执行编译后的 IL 代码,并提供了对 .NET 平台上的 API 的访问。
特点:
灵活性较高:Mono 运行时环境支持动态代码执行和反射等功能,使得 C# 代码具有较高的灵活性。
开发者友好:Mono 提供了丰富的调试和性能分析工具,方便开发者进行代码调试和优化。
优势:
跨平台支持:Mono 可以在多个平台上运行,包括 Windows、macOS、Linux 和各种移动平台。
实时脚本编译:Mono 支持实时脚本编译,允许开发者在编辑器中对脚本进行修改并立即看到效果。
2. IL2CPP(Intermediate Language to C++)
概述:
IL2CPP 是 Unity 引入的新的运行时环境,它将 IL 代码编译成本地的 C++ 代码,然后再编译成本地机器码。
IL2CPP 的目标是提高游戏的运行性能和安全性,减少跨平台开发的难度。
特点:
高性能:IL2CPP 将 IL 代码编译成本地机器码,消除了 JIT 编译的开销,提高了游戏的性能。
安全性:IL2CPP 生成的 C++ 代码可以在不支持 JIT 的平台上运行,提高了游戏的安全性和稳定性。
优势:
高性能:IL2CPP 生成的本地代码运行效率更高,尤其适用于需要较高性能的游戏。
跨平台支持:IL2CPP 仍然保持了跨平台的特性,可以在多个平台上运行,包括移动平台和主流游戏主机。
总的来说,Mono 和 IL2CPP 是 Unity 中处理 C# 代码的两种主要方案。Mono 具有灵活性和开发者友好的特点,适用于大多数游戏开发场景;而 IL2CPP 则注重性能和安全性,适用于对性能要求较高的游戏项目。开发者可以根据项目需求和目标平台选择合适的方案。