Unity面试题精选(6)

Unity面试题精选(6)
最新回答
天生傲骨

2026-10-18 08:41:59

C#中using和new关键字的意义
  • using关键字

    作为指令:用于为命名空间创建别名或导入其他命名空间中的类型,简化代码书写。例如:

    using MyAlias = System.IO; // 创建别名using System.Collections; // 导入命名空间

    作为语句:定义一个作用域,在作用域结束时自动释放对象(需实现IDisposable接口)。例如:

    using (var file = new StreamReader("path")) { // 使用file对象} // 自动调用file.Dispose()
  • new关键字

    创建实例:用于实例化类或结构体。例如:

    var obj = new MyClass();

    隐藏父类方法:在子类中隐藏父类的同名方法(需配合override或直接隐藏)。例如:

    class Parent { public void Foo() {} }class Child : Parent { public new void Foo() {} } // 隐藏父类Foo
System.String和System.StringBuilder的区别
  • System.String

    不可变性:字符串一旦创建,内容不可修改。任何修改操作(如拼接)都会生成新对象。

    性能问题:频繁拼接(如循环中使用+)会导致大量临时对象生成,增加内存压力。

    适用场景:少量字符串操作或无需修改的场景。

  • System.StringBuilder

    可变性:内部维护一个可修改的字符缓冲区,直接操作原内容,不生成新对象。

    高性能:适合频繁拼接或修改字符串的场景(如循环中拼接)。

    方法支持:提供Append、Insert、Remove等方法直接修改字符串。

    适用场景:需要高性能字符串操作的场景(如日志处理、动态文本生成)。

示例对比:

// String拼接(低效)string str = "";for (int i = 0; i < 1000; i++) { str += i.ToString(); // 每次循环生成新对象}// StringBuilder拼接(高效)var sb = new StringBuilder();for (int i = 0; i < 1000; i++) { sb.Append(i.ToString()); // 直接修改缓冲区}string result = sb.ToString();const和readonly的区别
  • const

    编译期常量:必须在声明时初始化,且值不可修改。

    静态性:隐式为static,无需加static修饰符。

    适用类型:仅支持基本类型(如int、string)或枚举。

    示例:

    const int MaxValue = 100; // 编译期确定值
  • readonly

    运行时常量:可在声明时或构造函数中初始化,初始化后不可修改。

    非静态性:默认非静态,可为实例字段或静态字段(需显式加static)。

    适用类型:支持任意类型(包括引用类型)。

    示例:

    readonly DateTime CreateTime = DateTime.Now; // 构造函数中初始化public MyClass(DateTime time) { CreateTime = time; // 允许在构造函数中赋值}

关键区别:

  • const是编译期常量,readonly是运行时常量。
  • const必须在声明时初始化,readonly可在构造函数中初始化。
C#中的委托与事件
  • 委托(Delegate)

    定义:委托是一种类型安全的函数指针,可将方法作为参数传递。

    声明:使用delegate关键字定义签名。例如:

    public delegate void MyDelegate(string message);

    使用:实例化委托并关联方法。例如:

    MyDelegate del = Console.WriteLine; // 关联静态方法del("Hello"); // 调用委托
  • 事件(Event)

    定义:事件是一种特殊的委托,用于封装委托实例,提供更安全的发布-订阅模式。

    声明:在类中用event关键字修饰委托类型。例如:

    public class Publisher { public event MyDelegate OnMessage; // 声明事件 public void Notify(string message) { OnMessage?.Invoke(message); // 触发事件 }}

    使用:外部类只能订阅(+=)或取消订阅(-=)事件,不能直接调用。

关键区别:

  • 委托是类型,事件是委托的封装。
  • 事件限制了外部对委托的直接调用,增强安全性。
ArrayList和List<T>的主要区别
  • ArrayList

    非泛型集合:存储元素时统一视为object类型,需手动拆装箱。

    性能问题:拆装箱操作导致性能损耗,且存在类型安全隐患。

    灵活性:可存储任意类型(值类型或引用类型),但需显式类型转换。

    示例:

    var list = new ArrayList();list.Add(1); // 装箱(int -> object)int num = (int)list[0]; // 拆箱(object -> int)
  • List<T>

    泛型集合:编译时确定元素类型,避免拆装箱,性能更高。

    类型安全:编译器检查类型,减少运行时错误。

    功能丰富:提供Add、Remove、Find等方法,支持LINQ查询。

    示例:

    var list = new List<int>();list.Add(1); // 直接存储int,无需拆装箱int num = list[0]; // 直接读取int

关键区别:

  • ArrayList是非泛型集合,存在拆装箱和类型安全问题;List<T>是泛型集合,性能更高且类型安全。
  • 优先使用List<T>,除非需要兼容旧代码或处理未知类型。