MIL26——模拟面试题

C#

  1. 以下代码,请问最终的打印结果是多少?为什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class TestClass
    {
    public int i = 0;
    }

    static void TestFun(TestClass obj)
    {
    obj = new TestClass();
    obj.i = 10;
    }

    static void Main(string[] args)
    {
    TestClass t = new TestClass();
    TestFun(t);
    Console.WriteLine(t.i);
    }
  2. 基于上一题,我们要如何修改,才能让最后的结果为10?请说出 3 种方式

  3. C# 中 List​ 中的 Sort​ 方法中,传入的比较器委托函数,返回的 -1​, 0​, 1 分别代表什么意思?

  4. C# 中的 CLR 是什么?

  5. 代码混淆是什么意思?有什么作用?

Unity

  1. Unity 生命周期函数中在整个生命周期中可能会被反复执行的有哪些?(至少说出5个)
  2. Unity 中生命周期函数被调用的底层原理是什么?
  3. 如何在 UGUI 中处理不同分辨率和屏幕比例的适配?
  4. UGUI 中如何做到点击按钮时,不要响应其他 Input 相关的检测
  5. Unity 中前向渲染路径、顶点照明渲染路径、延迟渲染路径各自的优缺点是什么?

答案

  1. 以下代码,请问最终的打印结果是多少?为什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class TestClass
    {
    public int i = 0;
    }

    static void TestFun(TestClass obj)
    {
    obj = new TestClass();
    obj.i = 10;
    }

    static void Main(string[] args)
    {
    TestClass t = new TestClass();
    TestFun(t);
    Console.WriteLine(t.i);
    }

    答:0

    因为在函数参数传递时是按值传递的,这意味着参数的副本会被传递给方法,而不是原始对象的引用。
    因此,当在 TestFun​ 方法内部重新为 obj​ 分配一个新的对象时,只是修改了这个副本的引用,而不会影响到 Main​ 方法中的 t 对象

  2. 基于上一题,我们要如何修改,才能让最后的结果为10?请说出 3 种方式

    1. TestFun​ 中参数前加 ref
    2. TestFun​ 中参数前加 out
    3. 不要在 TestFun​ 中 new​ 对象,而是直接修改 obj.i
    4. 通过 TestFun​ 直接返回一个新对象,在外部赋值给 t

    等等

  3. C# 中 List​ 中的 Sort​ 方法中,传入的比较器委托函数,返回的 -1​, 0​, 1 分别代表什么意思?

    比较器委托函数会传入两个对象 -1

    • -1 表示第一个对象小于第二个对象
    • 0 表示两个对象相等
    • 1 表示第一个对象大于第二个对象
  4. C# 中的 CLR 是什么?

    CLR 全称为 Common Language Runtime(公共语言运行时)它是 .NET Framework 的基础,所有的 .NET 技术都是建立在此之上的
    它是一个在执行时管理代码的代码,提供内存管理、 线程管理等等核心服务,就好像一个小型的操作系统一样。所以形象的把它称为“.NET 虚拟机”。
    如果想要应用程序在目标操作系统上能够运行,就必须依靠 .NET 提供的 CLR 环境来支持
    那就必须在操作系统上安装 .NET Framework 它会把程序集中的 IL(中间代码)翻译成机器码最终在操作系统上运行

  5. 代码混淆是什么意思?有什么作用?

    代码混淆(也称花指令)是指通过各种技术手段使代码变得难以理解的一种技术。
    混淆后的代码仍然可以正常运行,只是它的机构和逻辑会变得比较复杂和难以阅读。
    主要作用:保护知识产权,当代码被反编译后,能够提高理解门槛,让破解和复制变得更困难

Unity

  1. Unity 生命周期函数中在整个生命周期中可能会被反复执行的有哪些?(至少说出5个)

    1. Update:每帧调用
    2. LateUpdate​:每一帧最后被调用,晚于 Update
    3. FixedUpdate:固定频率调用,和帧率无关
    4. OnEnable:对象第一次启用以及对象从禁用状态切换到启用状态时被调用
    5. OnDisable:对象被禁用时调用,从启用状态切换到禁用状态时调用
  2. Unity 中生命周期函数被调用的底层原理是什么?

    反射,当脚本被加载时,Unity 使用反射来检测脚本中定义了哪些生命周期函数,
    并为了避免每一帧中使用反射,Unity 会在脚本加载时将这些函数缓存起来。
    在主循环中的每一帧的特殊时机去调用对应的生命周期函数,或基于事件触发驱动(比如失活,激活等情况)

  3. 如何在 UGUI 中处理不同分辨率和屏幕比例的适配?

    1. 利用 Canvas Scaler 组件,根据屏幕分辨率或物理尺寸进行缩放
    2. 利用 RectTransform 的锚点和边距设置,适应不同分辨率的布局(常用九宫格布局)
  4. UGUI 中如何做到点击按钮时,不要响应其他 Input 相关的检测

    利用 EventSystem​ 中的 IsPointerOverGameObject​ 方法判断
    当点击 UI 中按钮时,IsPointerOverGameObject​ 方法会返回 true,在此帧不处理输入检测逻辑即可

  5. Unity 中前向渲染路径、顶点照明渲染路径、延迟渲染路径各自的优缺点是什么?

    • 前向渲染路径

      • 优点:适用于相对简单的场景和较少数量的光源,基本可以实现任何渲染效果。设备支持率较高
      • 缺点:对于复杂场景和大量光源的情况性能消耗相对较大
    • 顶点照明渲染路径

      • 优点:相对来说,性能开销较小,适用于资源受限设备极差时的轻量级渲染情景
      • 缺点:表现效果较差,光照计算精度较低
    • 延迟渲染路径

      • 优点:适用于复杂场景和大量光源,能够有效减少光照计算的开销
      • 缺点:对于透明物体和一些特殊效果不能直接支持,需要复杂的处理。
        并且对硬件有一定要求,不是所有设备都支持,在一些性能较差的移动设备上不受支持