MIL1——模拟面试题

问题

C#

  1. 装箱和拆箱是什么?
  2. 值和引用类型在变量赋值时的区别是什么?
  3. 委托和事件在使用上的区别是什么?
  4. 有两个接口IA和IB,他们中有一个同名方法Test(),一个类同时继承这两个接口,应该如何处理他们的同名方法?
  5. 请说明C#中的List是如何扩容的

Unity

  1. Unity中点乘和叉乘对于我们来说的作用是什么?

  2. Unity中多线程执行下面哪些代码会报错?

    • A. Application.persistentDataPath
    • B. File.Exists(“文件名”)
    • C. transform.Translate
    • D. Object.Destroy(对象)
  3. Application.streamingAssetsPath 和 Application.persistentDataPath 两个路径有何区别?对于我们的意义是什么?

  4. 请简述Unity中协程的原理

  5. 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
        5
        var 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
        2
        list1.Capacity = 4194304
        list2.Capacity = 8388608

        在这个例子中,list1​ 的容量是 2^22​,当向 list2​ 添加一个元素时,它的容量会从 2^22​ 扩容到 2^23​。

        这种扩容机制确保了List<T>​在添加元素时能够动态地调整其大小,
        但也意味着在某些情况下可能会有额外的内存开销,因为每次扩容都会创建一个新的数组并复制旧数组的元素。
        因此,在处理大量数据时,合理预估 List<T>​ 的初始容量可以提高性能和内存使用效率。

    • Unity

      • 问题一

        • Unity中点乘和叉乘对于我们来说的作用是什么?

          答案:

          • 点乘作用

            1. 判断对象的方位
            2. 计算两向量之间的夹角
          • 叉乘作用

            1. 获取一个平面的法向量
            2. 得到两向量之间的左右位置关系
      • 问题二

        • Unity中多线程执行下面哪些代码会报错?

          • A. Application.persistentDataPath
          • B. File.Exists("文件名")
          • C. transform.Translate
          • D. Object.Destroy(对象)

          答案: A、C、D UnityEngine命名空间中相关类基本都不能被Unity中多线程使用

      • 问题三

        • Application.streamingAssetsPath 和 Application.persistentDataPath 两个路径有何区别?对于我们的意义是什么?

          答案:

          • Application.streamingAssetsPath​ 只读

            Application.streamingAssetsPath​ 适合放置一些默认2进制配置文件

          • Application.persistentDataPath​ 可读可写

            Application.persistentDataPath​ 用于处理数据持久化,或作为热更新下载内容的存放目录,因为它可读可写

      • 问题四

        • 请简述Unity中协程的原理

          答案: Unity中的协同程序分为两部分:

          1. 协程函数本体(迭代器函数)
          2. 协程调度器(协程管理器)

          协程利用迭代器函数的分步执行的特点 加上 协程调度器对迭代器函数们进行统一管理
          根据迭代器函数的返回值来决定下一次执行函数逻辑的时间点,从而实现逻辑分时分步执行的目的

      • 问题五

        • Unity底层如何处理C#代码?

          答案: 两种方案 Mono和IL2CPP

          • Mono
          • IL2CPP