2026 .NET 面试八股文:高频题 + 答案 + 原理(进阶核心篇)

张开发
2026/4/17 1:09:32 15 分钟阅读

分享文章

2026 .NET 面试八股文:高频题 + 答案 + 原理(进阶核心篇)
前言2026年.NET生态持续升温.NET 10正式普及、Native AOT成为企业选型核心、AI集成与云原生落地加速面试考察重点也从基础语法转向「原理实战性能」三维考核。本文整理了2026年.NET/C#面试高频题覆盖初级→中级→高级每道题均包含「高频提问场景标准答案底层原理避坑提示」拒绝无效背诵帮你吃透核心逻辑从容应对面试文末附面试加分技巧。二、进阶核心篇中级必问考察框架理解核心考点ASP.NET Core、EF Core、依赖注入、异步编程是中级开发/后端开发的核心考察点重点考察「框架使用底层逻辑」。1. 高频题ASP.NET Core 的启动流程是什么中间件的执行顺序为什么重要提问场景中级后端必问常结合「中间件配置」追问。标准答案1ASP.NET Core 启动核心流程以.NET 8为例1.入口为Program.cs创建WebApplicationBuilder实例用于配置服务和环境2. 通过builder.Services注册服务如依赖注入、数据库上下文、跨域等3. 调用builder.Build()创建WebApplication实例构建请求处理管道4. 配置中间件管道如UseStaticFiles、UseAuthentication、UseAuthorization等5. 调用app.Run()启动Web服务监听HTTP请求。2中间件执行顺序的重要性中间件是处理HTTP请求和响应的组件请求按「注册顺序」依次经过中间件响应按「反向顺序」返回顺序错误会导致功能失效例如UseAuthentication()身份认证必须在UseAuthorization()授权之前否则授权时无法获取认证信息全局异常处理中间件必须放在最前面否则无法捕获后续中间件的异常UseRouting()路由匹配必须在UseEndpoints()端点映射之前否则无法匹配路由。底层原理中间件管道本质是一个委托链每个中间件都包含一个RequestDelegate委托接收HttpContext并返回Task中间件通过Use、Run、Map等方法注册到委托链请求到来时依次执行委托响应时反向执行。避坑提示Run方法是「终结中间件」注册后后续中间件不会执行需谨慎使用Map方法是「分支中间件」按路径分支处理请求分支内的中间件仅对该路径生效。2. 高频题.NET 依赖注入DI的三种生命周期是什么区别是什么提问场景中级必问常追问「生命周期倒挂问题」「DbContext为什么用Scoped」。标准答案.NET内置DI容器支持3种生命周期核心区别是实例的创建时机和销毁时机1. Transient瞬时每次请求服务时都会创建一个新实例生命周期最短2. 适用场景轻量级、无状态的服务如工具类、辅助类。3. Scoped作用域同一个HTTP请求内共用一个实例不同请求创建新实例4. 适用场景DbContext、业务逻辑服务确保同一请求内数据一致性。5. Singleton单例整个应用生命周期内只创建一个实例所有请求共用6. 适用场景无状态、全局唯一的服务如配置服务、日志服务。底层原理DI容器内部维护一个服务注册表记录服务类型和生命周期当请求服务时容器根据生命周期创建实例并管理其生命周期Transient每次创建新实例使用后立即释放Scoped绑定到HttpContext请求结束后释放Singleton在容器初始化时创建应用停止时释放。避坑提示禁止将Scoped服务注入到Singleton服务中生命周期倒挂因为Singleton生命周期长于Scoped会导致Scoped实例被长期持有请求结束后无法释放引发内存泄漏或线程安全问题若需在Singleton中使用Scoped服务需通过IServiceScopeFactory创建临时作用域。3. 高频题EF Core中Tracking跟踪和NoTracking无跟踪的区别什么时候用提问场景中级后端必问常结合查询性能、数据修改考察。标准答案Tracking跟踪查询EF Core会跟踪查询到的实体对象记录实体的状态新增、修改、删除后续调用SaveChanges()时会自动将实体的变更同步到数据库适用场景查询后需要修改实体并保存到数据库如编辑、删除操作。NoTracking无跟踪查询EF Core不跟踪查询到的实体对象不记录实体状态查询效率更高减少内存开销和跟踪开销适用场景仅查询数据不进行修改如列表查询、详情展示。底层原理EF Core内部有一个变更跟踪器ChangeTrackerTracking查询时会将实体加入变更跟踪器记录实体的原始值和当前值NoTracking查询时实体不会加入变更跟踪器查询后立即脱离EF Core的管理无法通过SaveChanges()同步变更。代码示例// Tracking 查询默认 var user _dbContext.SysUsers.FirstOrDefault(u u.Id 1); user.UserName newName; _dbContext.SaveChanges(); // 会同步修改到数据库 // NoTracking 查询推荐用于仅查询场景 var user _dbContext.SysUsers.AsNoTracking().FirstOrDefault(u u.Id 1); user.UserName newName; _dbContext.SaveChanges(); // 不会同步修改无跟踪避坑提示大量数据查询如分页列表时务必用AsNoTracking()否则会导致变更跟踪器持有大量实体引发内存泄漏和性能下降若NoTracking查询后需要修改实体需调用Attach()方法将实体重新加入跟踪。4. 高频题async/await的原理是什么和多线程有什么区别提问场景中级必问常结合IO密集型/CPU密集型场景追问。标准答案1async/await 原理async/await是.NET的异步编程模型核心是任务调度状态机并非多线程async标记方法为异步方法告诉编译器该方法包含await关键字会被编译为状态机继承IAsyncStateMachineawait暂停当前异步方法的执行将线程归还到线程池不会阻塞线程当await后的异步操作如数据库查询、网络请求完成后线程池会分配一个线程继续执行await后的代码。2与多线程的区别async/await异步非阻塞不创建新线程除非await的操作本身是多线程核心是「释放线程资源」提升系统吞吐量适合IO密集型场景如数据库、网络请求多线程Thread、Task.Run并行执行会创建新线程核心是「利用多核CPU并行处理任务」适合CPU密集型场景如计算、排序。底层原理async方法被编译为状态机后会记录方法的执行状态未开始、暂停、完成await本质是调用Task的GetAwaiter()方法注册回调函数当异步操作完成后回调函数会触发状态机切换继续执行后续代码。避坑提示不要在async方法中使用Task.Wait()、Task.Result会导致线程阻塞违背异步初衷async方法返回值优先用TaskT有返回值或Task无返回值避免用void仅适合事件处理无法捕获异常。附录.NET面试题库:.NET面试题库.NET知识库.NET知识库

更多文章