.NET 面试会问哪些问题?

作者 Aaron Cao · 更新于

.NET 面试会问哪些问题?
常见问题包括运行时(CLR、垃圾回收、值类型与引用类型)、语言特性(async 和 await、LINQ、泛型、记录)、框架(ASP.NET Core 中间件与依赖注入、EF Core),以及长期运行的服务发生内存泄漏或 API 端点响应缓慢等情景题。面试官看重的是你的推理过程。

常见问题包括运行时(CLR、垃圾回收、值类型与引用类型)、语言特性(async 和 await、LINQ、泛型、记录)、框架(ASP.NET Core 中间件与依赖注入、EF Core),以及长期运行的服务发生内存泄漏或 API 端点响应缓慢等情景题。面试官看重的是你的推理过程。

.NET 面试通常先问哪些运行时和语言问题?

面试官通常从框架的起点——运行时——开始。你需要解释公共语言运行时的作用(加载程序集、即时编译中间语言、管理内存),随后深入一层讨论垃圾回收。后续问题往往可以预见:垃圾回收器为什么采用分代机制,什么会让对象存活并进入更高代,大对象堆有什么用途,以及既然内存由系统管理,为什么还需要 IDisposableusing。最后一个问题应从文件句柄、连接等非托管资源入手,因为垃圾回收器并不知道如何及时释放它们。

  • 值类型和引用类型。它们分别存放在哪里、复制对各自意味着什么,以及装箱有什么成本。
  • async 和 await。说明等待任务会释放调用线程,而不是阻塞它;为什么 async void 仅用于事件处理程序;以及人们警告 .Result 时所说的死锁是什么。
  • LINQ。延迟执行是常见陷阱:IEnumerable 查询在被枚举时才会运行,而不是在写下时运行;针对数据库提供程序的查询,也只有在表达式可被提供程序理解时才能转换为 SQL。
  • 泛型、接口和记录。泛型约束、为了可测试性而优先使用接口而非基类的原因,以及记录的值相等性有什么好处。

回答每个问题时,都要说明机制及其一个后果。比如,因为大多数对象很快就会消亡,所以第零代回收成本很低——这才是面试官期待的深度;只说出各代的名称却不解释原因是不够的。

ASP.NET Core 和 EF Core 会怎么考?

你对编写控制器很有信心,却担心问题会涉及平时很少接触的底层机制。这种担心是有道理的,因为框架类问题正集中在这里。下面按照常见提问顺序介绍这些机制,并附上每项通常会引出的追问。

  • 请求管道。中间件按注册顺序运行,每个组件都会决定是否调用下一个组件。追问:身份验证相对于授权应放在哪里?如果注册顺序颠倒,会发生什么?
  • 依赖注入生命周期。Singleton 在应用程序生命周期内一直存在,scoped 在一次请求期间存在,transient 每次解析时都会创建。经典陷阱是将数据库上下文等 scoped 服务注入 singleton;你要能解释为什么这是一个缺陷。
  • 配置和选项。分层配置源、环境覆盖,以及用于强类型设置的选项模式。
  • EF Core。变更跟踪以及何时应在只读查询中将其关闭、N+1 问题以及如何通过预先加载或投影规避它、迁移,还有应坦诚承认手写查询优于 LINQ 的临界点。
  • 测试。接口和 DI 容器如何让服务具备可测试性,以及内存中提供程序能证明和不能证明真实数据库的哪些行为。

最优秀的候选人会把这些知识联系起来:在 singleton 后台服务中解析 scoped 上下文,不是一道纯知识题,而是面试官在实际发布的软件中遇到过的内存与正确性缺陷。他们希望听到你会显式创建作用域。

情景题通常如何进行?

高级职位的多轮面试会给出一种症状,并观察你的分析方法。一个典型例子是:某位后端工程师面试物流公司的高级职位时,被告知一个 ASP.NET Core API 的内存占用会连续数日攀升,直到容器重启。优秀的回答不会靠猜测,而是会询问发生了哪些变化,检查是否有对象被静态缓存或长期存在的事件订阅捕获,查找 singleton 持有 scoped 服务的情况,检查大对象堆的增长,并在提出修复方案之前获取内存快照。面试官评估的是你的排查顺序。

其他常见情景包括:某个端点只在高负载下变慢,此时应依次排查同步数据库调用、改用 async、连接池耗尽和缓存;共享集合中的竞态条件,以及并发集合与各种锁定方案的成本;某个请求必须调用三个下游服务时,如何处理超时、重试和部分失败;以及如何在不停机的情况下通过迁移添加一列。每种情况下,都应说明约束条件、选择一种机制,并明确说出取舍。

如果事先通过追问形式大声演练,这些题会容易得多;模拟面试模式正是为此设计。其他语言和岗位的题库汇总在按岗位和主题分类的面试题中。

AI 面试助手能帮助回答 .NET 问题吗?

在对话式面试中可以,但须遵守明确的限制。SubcueAI 的原生 macOS 和 Windows 桌面应用会采集系统音频和你的麦克风声音,并在本地浮层中显示简短的回答建议。因此,当面试官问为什么 singleton 中的 scoped 上下文是一个缺陷时,相关机制会显示在屏幕上,供你用自己的话解释。浏览器扩展适用于 Chrome 和 Edge 中的浏览器标签页通话,并且只采集会议标签页的音频。不会有机器人加入通话,也不会向会议页面注入任何内容;设置方法请参阅教程页面。

限制包括:监考测评、录屏、公司管理的笔记本电脑,以及在他人观察下输入 C# 的现场编程练习,都不在适用范围内;而且,面试要求你编写代码时,恰恰是助手最不擅长的场景。它最适合帮助处理上述运行时、框架和权衡取舍类问题。请先向它提供你的简历,使建议能够反映你真正构建过的系统;该资料保存在简历生成器中。

常见问题

.NET 垃圾回收器为什么采用分代机制?

大多数对象很快就会消亡,因此频繁且低成本地回收最新一代,可以在不扫描整个堆的情况下释放大部分内存。存活的对象会晋升,并以较低频率被回收,从而让典型分配模式下的暂停时间保持较短。

ASP.NET Core 中 singleton、scoped 和 transient 有什么区别?

Singleton 在整个应用程序中只创建一次,scoped 每次请求创建一次,transient 每次解析时创建。将 scoped 服务注入 singleton 会使其在整个应用程序生命周期内一直被持有,这是数据库上下文中常见的缺陷。

await 实际上做了什么?

它将方法的剩余部分注册为延续操作,并把控制权交还给调用方,因此线程可在所等待的工作完成前保持空闲。相反,使用 .Result 或 .Wait 阻塞等待任务,可能会在需要重新使用该线程的上下文中造成死锁。

EF Core 中的 N+1 问题是什么?

先加载父项列表,然后针对每个父项分别查询其子项。使用 Include 预先加载,或只投影所需字段,可以把它变成一次或两次查询。

SubcueAI 能在受监考的 .NET 编程测试中提供帮助吗?

不能。监考和录制的测评不在适用范围内,在他人观察下进行现场编程也必须由你独立完成。它适用于对话式面试,而模拟面试模式可供你事先练习。

相关问题

← 更多关于 按岗位与主题分类的面试问题