MIL1——模拟面试题
MIL1——模拟面试题
问题
C#
- 装箱和拆箱是什么?
- 值和引用类型在变量赋值时的区别是什么?
- 委托和事件在使用上的区别是什么?
- 有两个接口IA和IB,他们中有一个同名方法Test(),一个类同时继承这两个接口,应该如何处理他们的同名方法?
- 请说明C#中的List是如何扩容的
Unity
-
Unity中点乘和叉乘对于我们来说的作用是什么?
-
Unity中多线程执行下面哪些代码会报错?
- A. Application.persistentDataPath
- B. File.Exists(“文件名”)
- C. transform.Translate
- D. Object.Destroy(对象)
-
Application.streamingAssetsPath 和 Application.persistentDataPath 两个路径有何区别?对于我们的意义是什么?
-
请简述Unity中协程的原理
-
Unity底层如何处理C#代码?
答案
-
No.1模拟面试答案
-
C#
-
装箱和拆箱是指什么?
答案:
- 装箱——把栈中内容迁移到堆中去(值转引用)
- 拆箱——把堆中内容迁移到栈中去(引用转值)
-
值和引用类型在变量赋值时的区别是什么?
详见:CS2L4——值类型和引用类型
-
委托和事件在使用上的区别是什么?
答案: 事件相对委托来说,事件在外部使用时只能
+=
、-=
-
有两个接口IA和IB,他们中有一个同名方法
Test()
一个类同时继承这两个接口,应该如何处理他们的同名方法?答案:显式的实现接口
IA.Test()
、IB.Test()
-
请说明C#中的List是如何扩容的
答案:List的本质是数组
笔者查询得到:
在C#中,
List<T>
的扩容机制是通过倍增算法实现的。当List<T>
的元素数量达到当前容量时,它会创建一个新的数组,其容量是原数组的两倍,然后将原数组的元素复制到新数组中。例如,如果原数组的容量是4,当添加第五个元素时,List<T>
会扩容到8,以此类推。具体来说,如果
List<T>
的内部数组_items
的长度为0,它会初始化为4个容量。
之后,每次需要扩容时,它会将_items
的长度翻倍。这里有一个C#代码示例来演示这个过程:1
2
3
4
5var list1 = Enumerable.Range(0, (int)Math.Pow(2, 22)).ToList();
var list2 = new List<int>(list1);
list2.Add(1); // 添加一个元素触发扩容
Console.WriteLine($"list1.Capacity = {list1.Capacity}"); // 输出原始容量
Console.WriteLine($"list2.Capacity = {list2.Capacity}"); // 输出扩容后的容量输出:
1
2list1.Capacity = 4194304
list2.Capacity = 8388608在这个例子中,
list1
的容量是2^22
,当向list2
添加一个元素时,它的容量会从2^22
扩容到2^23
。这种扩容机制确保了
List<T>
在添加元素时能够动态地调整其大小,
但也意味着在某些情况下可能会有额外的内存开销,因为每次扩容都会创建一个新的数组并复制旧数组的元素。
因此,在处理大量数据时,合理预估List<T>
的初始容量可以提高性能和内存使用效率。
-
-
Unity
-
问题一
-
Unity中点乘和叉乘对于我们来说的作用是什么?
答案:
-
点乘作用
- 判断对象的方位
- 计算两向量之间的夹角
-
叉乘作用
- 获取一个平面的法向量
- 得到两向量之间的左右位置关系
-
-
-
问题二
-
Unity中多线程执行下面哪些代码会报错?
- A.
Application.persistentDataPath
- B.
File.Exists("文件名")
- C.
transform.Translate
- D.
Object.Destroy(对象)
答案: A、C、D UnityEngine命名空间中相关类基本都不能被Unity中多线程使用
- A.
-
-
问题三
-
Application.streamingAssetsPath 和 Application.persistentDataPath 两个路径有何区别?对于我们的意义是什么?
答案:
-
Application.streamingAssetsPath
只读
Application.streamingAssetsPath
适合放置一些默认2进制配置文件 -
Application.persistentDataPath
可读可写
Application.persistentDataPath
用于处理数据持久化,或作为热更新下载内容的存放目录,因为它可读可写
-
-
-
问题四
-
请简述Unity中协程的原理
答案: Unity中的协同程序分为两部分:
- 协程函数本体(迭代器函数)
- 协程调度器(协程管理器)
协程利用迭代器函数的分步执行的特点 加上 协程调度器对迭代器函数们进行统一管理
根据迭代器函数的返回值来决定下一次执行函数逻辑的时间点,从而实现逻辑分时分步执行的目的
-
-
问题五
-
Unity底层如何处理C#代码?
答案: 两种方案 Mono和IL2CPP
- Mono
- IL2CPP
-
-
-