Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

C# Day11

1.List 是数组还是链表?

答案:

数组

2.List 满了之后,我再加入一个元素效率会比较低,它的内部大概是一个什么样的执行过程?

答案:

数组搬家,会将原数组移动到更大的新数组中 效率较低,并且会产生内存垃圾

3.csharp 里面有一个常用接口叫 IDispose,他的作用是?

答案: IDispose 接口时 C# 中用于手动释放资源的机制 通过显示调用 Dispose()方法来实现资源的释放,避免资源泄露和浪费 它允许对象在不需要时显式地释放资源,而不是依赖于垃圾回收器的自动内存管理

4.cssharp 有垃圾回收机制,把一个对象设置为空的时候,系统会帮我们回收,它和接口 IDispose 有什么关系吗?为什么会存在两个做析构的事情的东西呢?

答案: C# 的垃圾回收机制,只会回收托管托管堆上分配的对象 对于非托管资源以及其它需要显示释放的资源,垃圾回收是无法自动处理的,因为这些资源不属于托管堆,因此垃圾回收器无法自动识别和回收。这种情况下我们就需要显式的手动释放这些资源 而 IDispose 接口就提供了一种通用的机制来进行资源清理,用于释放非托管资源

非托管资源:

  1. 文件句柄,在操作系统中打开的文件
  2. 数据库连接,与数据库服务器简历的连接
  3. 网络连接:比如 Socket 的连接对象
  4. unsafe 关键词中使用的指针
  5. 等等

5.Unity 中的生命周期函数,为什么设计成为反射调用,而不是通过继承重写生命周期函数的形式去实现?

答案:

可能原因:

  1. 并非所有继承 MonoBehaviour 的类都需要使用所有生命周期函数,如果使用继承,就会有大量的空虚函数被调用,而使用反射,有哪些生命周期函数就调用哪些,而且反射还可以调用私有方法。Unity 只需要维护有对应生命周期函数的脚本列表,就可以避免空虚函数的调用。

评论