NET开发工程师面试题(含答案·实战版)_第1页
NET开发工程师面试题(含答案·实战版)_第2页
NET开发工程师面试题(含答案·实战版)_第3页
NET开发工程师面试题(含答案·实战版)_第4页
NET开发工程师面试题(含答案·实战版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.NET开发工程师面试题(含答案·实战版)本套面试题适配初级、中级.NET开发岗位,贴合企业日常面试实操场景,涵盖C#基础、语法进阶、CLR机制、数据库、主流框架、项目实战、性能优化及常见问题排查,无模板化内容,贴合真实求职面试需求。一、C#基础语法面试题1.简述值类型和引用类型的区别,并举出常用类型案例参考答案:值类型存储在栈内存中,变量直接存储数据本身,赋值时执行值拷贝,新旧变量相互独立,互不影响;引用类型存储在堆内存中,变量仅存储对象的内存地址,赋值时仅拷贝地址,多个变量指向同一个内存对象,修改会相互影响。常用值类型:int、double、bool、char、struct、枚举;常用引用类型:string、class、数组、接口、委托。2.string和StringBuilder的区别,日常开发中如何选择使用?参考答案:string是不可变字符串,一旦初始化就无法修改,每次拼接、替换字符串都会生成新的字符串对象,频繁操作会产生大量内存垃圾,性能较差;StringBuilder是可变字符串,底层通过缓冲区存储数据,修改字符串时不会新建对象,仅修改原有内存数据,频繁操作性能优异。使用场景:单次、少量字符串操作使用string;循环拼接、大量字符串修改场景必须使用StringBuilder。3.const和readonly的区别参考答案:1.赋值时机:const是编译时常量,必须在声明时赋值;readonly是运行时常量,可在声明或构造函数中赋值;2.作用域:const可修饰字段、局部变量;readonly仅能修饰类字段;3.内存特性:const属于静态常量,全局共享;readonly属于实例常量(静态readonly除外);4.可修改性:两者赋值后均不可修改。4.说说ref和out的用法及核心区别参考答案:两者均为引用传参,方法内可修改实参数值,核心区别在于初始化要求:1.ref:参数必须在传入方法前完成初始化,方法内可修改也可不修改;2.out:参数传入前无需初始化,但方法内部必须对参数完成赋值,否则编译报错;日常开发中,ref多用于双向数据修改,out多用于方法返回多个结果。二、C#进阶与CLR机制面试题1.简述装箱和拆箱的原理,以及如何避免频繁装箱拆箱参考答案:装箱:将值类型数据转换为引用类型,本质是在堆内存中开辟空间,创建新的引用对象,复制值类型数据;拆箱:将引用类型数据转回值类型,需先判断对象类型合法性,再从堆内存中读取数据复制到栈内存;装箱拆箱会产生内存开销和GC压力,频繁操作会降低程序性能。优化方式:使用泛型替代object参数、避免值类型与引用类型频繁转换、使用值类型集合(如List<int>而非ArrayList)。2.讲讲GC垃圾回收机制,以及GC的回收时机参考答案:CLR的GC负责回收堆内存中无引用的对象,释放内存空间,分为三代回收机制:0代、1代、2代。0代空间最小、回收频率最高,2代空间最大、回收频率最低。GC回收时机:1.新对象分配时,0代内存空间不足,触发0代回收;2.主动调用GC.Collect()手动触发回收(项目中不推荐频繁使用);3.程序退出时,触发全量GC回收;4.系统内存不足时,自动触发GC回收。3.委托和事件的区别,为什么项目中优先用事件?参考答案:1.权限控制:委托是公开的,外部可以直接赋值、清空、调用;事件是委托的封装,外部仅能订阅和取消订阅,无法直接赋值和触发,安全性更高;2.职责分离:事件遵循发布订阅模式,发布者只负责触发事件,不干预订阅者逻辑,耦合度更低;3.适用场景:委托多用于单方法回调,事件多用于多订阅者的消息通知场景。项目中优先用事件,核心是规避外部篡改委托列表的风险,保证程序稳定性。4.泛型的好处是什么?泛型约束有哪些常用类型?参考答案:泛型好处:避免装箱拆箱、提升代码复用性、编译时类型校验,杜绝类型转换异常、提高程序运行性能。常用泛型约束:值类型约束、引用类型约束、无参数构造函数约束、基类约束、接口约束。三、.NET框架与Web核心面试题1.说说ASP.NETCore中间件的执行流程,以及自定义中间件的方式参考答案:ASP.NETCore中间件采用管道模型,请求进来后按照注册顺序依次经过各个中间件,响应时反向回溯,形成“请求进、响应出”的链式执行流程。默认内置中间件包含路由、授权、静态文件、异常处理等。自定义中间件两种方式:1.委托方式:通过app.Use()直接编写匿名委托,适合简单逻辑;2.类方式:自定义中间件类,实现InvokeAsync方法,适合复杂、可复用的中间件逻辑。2..NETCore依赖注入的生命周期有哪些?分别适用什么场景?参考答案:1.Transient(瞬时):每次请求获取实例都会新建对象,生命周期最短,适合轻量级、无状态服务,如工具类、数据校验服务;2.Scoped(作用域):同一个HTTP请求内共用一个实例,不同请求创建新实例,是Web项目最常用生命周期,如业务逻辑服务、数据库仓储服务;3.Singleton(单例):程序启动后创建一次,全局所有请求共用一个实例,生命周期最长,适合全局配置、缓存服务、日志服务等无状态全局服务。3.简述路由匹配原理,Attribute路由和传统路由的区别参考答案:路由核心是将客户端URL请求与控制器Action方法进行匹配,解析路由参数,定位执行接口。传统路由:全局统一配置路由规则,基于控制器、Action命名规则匹配,灵活性差,适合简单项目;Attribute路由:在控制器和Action上通过特性标签自定义路由,精准控制接口地址,支持路由优先级、多路由匹配,适配RESTful风格接口,是.NETCore项目主流用法。4.说说RESTful接口的设计规范参考答案:1.资源使用名词定义,禁止使用动词,如/user、/order;2.通过HTTP请求方法区分操作:GET查询、POST新增、PUT修改、DELETE删除;3.通过HTTP状态码返回请求结果,200成功、201创建成功、400参数错误、401未授权、404资源不存在、500服务异常;4.接口统一返回格式,包含状态码、提示信息、业务数据;5.分页、排序、筛选参数通过URL传参,不嵌套在路由中。四、EFCore与数据库面试题1.EFCore三种数据迁移方式(CodeFirst、DBFirst、ModelFirst)的适用场景参考答案:1.CodeFirst(代码优先):先编写实体类和配置,通过迁移命令自动生成、更新数据库,新项目、迭代开发项目主流使用,灵活可控;2.DBFirst(数据库优先):基于已有数据库表结构,反向生成实体类,适合老旧项目维护、数据库已定型的项目;3.ModelFirst(模型优先):通过可视化模型设计表结构,生成数据库和实体类,目前使用极少,兼容性差,基本被淘汰。2.解释EFCore懒加载和急加载的区别,以及各自优缺点参考答案:懒加载:查询主实体时,不加载关联导航属性,访问关联属性时才会发起新的数据库查询。优点是单次查询速度快、减少无效数据加载;缺点是会产生多次数据库请求,容易引发N+1查询问题,批量查询性能差。急加载:通过Include、ThenInclude提前指定需要加载的关联属性,一次性查询所有关联数据。优点是仅一次数据库请求,避免N+1问题,批量查询性能高;缺点是单次查询数据量过大时,会浪费资源。3.日常开发中如何优化EFCore查询性能?参考答案:1.避免懒加载,批量查询使用Include预加载关联数据,杜绝N+1查询;2.按需查询,使用Select只查询需要的字段,禁止Select*查询全字段;3.分页查询必须加条件筛选和分页参数,避免查询全表数据;4.高频查询字段建立数据库索引;5.批量新增、修改、删除使用EFCore批量操作方法,避免循环单条操作;6.复杂查询使用原生SQL,避免EF拼接低效SQL。五、项目实战与问题排查面试题1.接口出现跨域问题的原因?.NETCore中如何解决跨域?参考答案:跨域原因:浏览器同源策略限制,协议、域名、端口任意一个不同,即为跨域请求,浏览器会拦截响应。.NETCore解决方案:1.配置CORS中间件,允许指定域名、请求方法、请求头跨域;2.开发环境可配置允许所有跨域,生产环境必须配置指定可信域名,保证安全性;3.接口添加[EnableCors]特性单独开启跨域。2.程序出现内存泄漏的常见原因?如何排查.NET程序内存泄漏?参考答案:常见内存泄漏原因:静态集合无限累加数据未清空、事件订阅未取消导致对象无法回收、文件/数据库连接未释放、大对象频繁创建、缓存无过期策略无限堆积。排查方式:1.通过VS性能探查器、DotMemory工具抓取内存快照,分析常驻对象;2.查看GC回收日志,判断是否存在GC回收无效、内存持续上涨;3.检查静态变量、事件订阅、资源释放逻辑;4.排查缓存、队列、集合数据是否未做清理。3.说说你项目中用过的缓存方案,以及缓存穿透、击穿、雪崩的解决方案参考答案:常用缓存方案:本地内存缓存(IMemoryCache)、Redis分布式缓存。本地缓存速度快,适合单机高频小数据;Redis缓存支持分布式、持久化,适合集群项目、大数据缓存。1.缓存穿透:查询不存在的数据,直接穿透到数据库。解决方案:接口参数校验、空值缓存、布隆过滤器;2.缓存击穿:热点key过期瞬间,大量请求直达数据库。解决方案:热点key永不过期、互斥锁、二级缓存;3.缓存雪崩:大量缓存key同时过期,导致数据库压力骤增。解决方案:缓存过期时间加随机偏移量、搭建缓存集群、服务熔断降级。4.简述异步编程async/await的原理和使用注意事项参考答案:async/await是基于Task的异步语法糖,本质是状态机实现。async标记方法为异步方法,不会阻塞主线程;await用于等待异步任务执行完成,任务执行期间主线程可以处理其他请求,任务完成后回归执行后续逻辑。注意事项:1.异步方法尽量全程异步,避免asyncvoid(除事件方法外);2.禁止同步阻塞异步方法(如Task.Result、Task.Wait()),极易造成死锁;3.异步方法需要合理捕获异常,避免未捕获的异步异常导致程序崩溃;4.批量异步任务优先使用Task.WhenAll,提升执行效率。六、高频手写代码面试题1.手写单例模式(双重校验锁)参考答案:csharp

publicclassSingleton

{

privatestaticvolatileSingleton_instance;

privatestaticreadonlyobject_lockObj=newobject();

privateSingleton(){}

publicstaticSingletonGetInstance()

{

if(_instance==null)

{

lock(_lockObj)

{

if(_instance==null)

{

_instance=newSingleton();

}

}

}

return_instance;

}

}2.简单实现异步接口请求、数据分页查询逻辑参考答案:csharp

[ApiController]

[Route("api/[controller]")]

publicclassOrderController:ControllerBase

{

privatereadonlyIOrderService_orderService;

publicOrderController(IOrderServiceorderService)

{

_orderService=orderService;

}

[HttpGet("page")]

publicasyncTas

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论