版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.NET面试试题及详细答案(企业实战版)一、.NET基础语法与核心原理(高频基础题)1、简述C#中值类型和引用类型的区别,以及各自常见类型?参考答案:值类型数据存储在栈空间,变量直接存储数据本身,赋值时是完整拷贝一份数据,两个变量相互独立,修改其中一个不会影响另一个。栈空间分配、释放速度快,不存在垃圾回收问题。常见值类型:int、double、bool、char、decimal、struct、枚举。引用类型数据存储在堆空间,变量仅存储数据的内存地址,赋值时是拷贝内存地址,多个变量指向同一个堆内存对象,修改任意一个变量的数据,其他指向该对象的变量都会同步变化。引用类型需要GC垃圾回收机制管理内存。常见引用类型:string、数组、类、接口、委托、集合(List、Dictionary等)。2、string和StringBuilder的区别?项目中什么场景下用哪个?参考答案:string是不可变字符串,一旦初始化就无法修改。每次对string进行拼接、替换、截取操作,都会在堆中生成一个新的字符串对象,频繁操作会产生大量内存垃圾,性能较差。StringBuilder是可变字符串,底层通过字符数组存储数据,修改数据时不会新建对象,直接在原有内存空间修改,频繁字符串操作性能极高。使用场景:单次、少量字符串操作、固定文本赋值使用string;循环拼接、批量文本组装、大量字符串修改的业务场景,必须使用StringBuilder。3、const和readonly的区别?参考答案:1)赋值时机:const是编译时常量,必须在声明时直接赋值;readonly是运行时常量,可以在声明时赋值,也可以在类的构造函数中赋值。2)作用域:const默认是静态的,不能用static修饰,属于类级别;readonly可以是实例级别,也可以手动加static变为静态。3)使用限制:const只能修饰值类型和string;readonly可以修饰任意类型,包括引用类型。4)修改权限:两者赋值后都不允许再次修改。4、override和overload的区别?参考答案:重写(override):存在于父子类之间,用于重写父类的虚方法、抽象方法,方法名、参数列表、返回值必须完全一致,目的是重写原有方法逻辑,实现多态。重载(overload):存在于同一个类中,多个方法名称相同,但参数个数、参数类型、参数顺序不同,返回值不参与重载判定,目的是提供多种参数调用方式。5、简述C#中的装箱和拆箱,以及如何避免频繁装箱拆箱?参考答案:装箱:将值类型转换为object引用类型,数据从栈内存转移到堆内存,会产生内存开销。拆箱:将object引用类型转回对应的值类型,需要强制类型转换,同样有性能损耗。规避方式:尽量使用泛型集合(List<T>、Dictionary<TKey,TValue>)替代非泛型集合(ArrayList、HashTable);避免频繁将值类型赋值给object类型变量;方法参数尽量使用指定值类型,不滥用object参数。二、.NET高级特性与内存机制1、简述.NETGC垃圾回收机制,以及GC的回收流程?参考答案:GC是.NET自动内存管理机制,专门负责回收堆中不再被使用的引用类型对象,释放内存空间,避免内存泄漏,开发者无需手动释放内存。堆内存分为三代:0代、1代、2代。0代空间最小、回收频率最高,主要存放新建的短期对象;1代是缓冲层;2代空间最大、回收频率最低,存放长期存活的大对象。回收流程:1)标记阶段:GC遍历所有存活对象,标记所有被引用、正在使用的有效对象;2)清除阶段:移除所有未被标记的无效垃圾对象;3)压缩阶段:整理内存碎片,将存活对象前移,保证内存连续性,提升后续内存分配效率。2、什么是内存泄漏?.NET中常见的内存泄漏场景有哪些?参考答案:内存泄漏指程序中已经不再需要的对象,因为存在有效引用,导致GC无法回收,长期占用内存,随着程序运行内存持续升高,最终引发程序卡顿、崩溃。常见场景:1)静态集合、静态变量长期持有对象引用,无法释放;2)事件订阅未取消,宿主对象被事件持有引用;3)文件流、数据库连接、网络请求等资源未手动释放,未使用using语句;4)长生命周期对象持有短生命周期对象引用,导致短对象无法回收。3、using语句的作用和原理?参考答案:using用于自动释放实现了IDisposable接口的资源,比如数据库连接、文件流、网络流、内存流等非托管资源。编译原理:using代码块会被编译器自动翻译成try-finally结构,无论代码正常执行还是出现异常,最终都会执行finally块中的Dispose方法,强制释放资源,避免资源泄露。4、泛型的作用和优势是什么?参考答案:泛型是一种类型延迟绑定的技术,定义类、方法、集合时不指定具体类型,在调用时指定实际类型。核心优势:1)类型安全,编译时校验类型,避免运行时类型转换异常;2)避免装箱拆箱,提升程序性能;3)代码复用,一套逻辑适配多种数据类型,无需重复写重载方法。三、ASP.NETCore框架核心面试题1、简述ASP.NETCore管道模型和请求处理流程?参考答案:ASP.NETCore采用中间件管道模型,所有HTTP请求都会按照注册顺序依次经过多个中间件,完成请求处理、响应返回。核心流程:1)客户端发起HTTP请求,到达服务器;2)请求依次经过注册的中间件(日志、跨域、路由、认证授权、异常处理等);3)路由中间件匹配对应的控制器接口;4)执行接口业务逻辑,返回结果;5)响应结果反向经过所有中间件,最终返回给客户端。2、依赖注入(DI)的作用,以及ASP.NETCore三种生命周期区别?参考答案:依赖注入是控制反转的实现方式,框架自动创建、管理对象实例,无需手动new对象,降低代码耦合度,方便单元测试、代码维护和替换实现。三种生命周期:1)Transient(瞬时):每次获取都是全新的对象,生命周期最短,适合轻量级无状态服务;2)Scoped(作用域):同一个请求内获取的是同一个对象,不同请求是不同对象,是业务服务最常用的生命周期;3)Singleton(单例):程序启动后全局唯一对象,全程复用,适合配置类、工具类服务,注意线程安全问题。3、ASP.NETCore中过滤器有哪些?各自作用?参考答案:1)授权过滤器(IAuthorizationFilter):最先执行,用于身份认证、权限校验,无权限直接拦截请求;2)资源过滤器(IResourceFilter):授权后、方法执行前执行,可实现缓存、请求拦截;3)动作过滤器(IActionFilter):控制器方法执行前后触发,用于参数校验、日志记录、参数格式化;4)异常过滤器(IExceptionFilter):全局捕获接口未处理异常,统一返回异常信息,记录错误日志;5)结果过滤器(IResultFilter):接口结果返回前后触发,统一封装返回格式、加密响应数据。4、跨域问题产生原因?ASP.NETCore如何解决跨域?参考答案:跨域是浏览器的同源策略限制,协议、域名、端口任意一个不同,即为跨域,浏览器会拦截异步请求。项目中主流解决方案:在Program中配置CORS跨域策略,允许指定域名、所有域名的请求,允许请求头、请求方法,支持跨域携带Cookie,全局注册中间件即可解决前后端跨域问题。四、EFCore数据库相关面试题1、EFCore中LazyLoading、EagerLoading、ExplicitLoading的区别?参考答案:1)延迟加载(LazyLoading):查询主表数据时,不加载关联表数据,访问关联属性时才自动查询数据库,优点是节省单次查询开销,缺点是容易产生多次数据库查询,引发N+1查询问题;2)贪婪加载(EagerLoading):通过Include、ThenInclude主动提前加载关联表数据,一次查询加载所有需要数据,避免多次查库,日常开发最常用;3)显式加载(ExplicitLoading):查询完主表数据后,后续通过Entry手动加载关联数据,灵活性较高,适合动态按需加载场景。2、什么是N+1查询问题?如何解决?参考答案:开启延迟加载时,查询N条主表数据,会执行1次主表查询,再针对每条数据执行1次关联表查询,总共N+1次数据库查询,频繁交互数据库,严重影响接口性能。解决方案:关闭不必要的延迟加载,查询关联数据时统一使用Include贪婪加载,一次性查询所有数据,杜绝多次查库。3、EFCore新增、修改、删除的批量操作优化?参考答案:原生EFCore逐条SaveChanges性能较差,批量操作建议使用扩展方案:1)使用批量操作插件(Zack.EFCore.Batch),实现无需查询实体的批量新增、修改、删除;2)批量新增使用AddRange批量添加实体,一次SaveChanges提交;3)超大批量数据采用原生SQL语句执行,提升执行效率。五、多线程、异步与并发(进阶高频)1、async/await的作用和原理?和同步方法的区别?参考答案:async/await是.NET异步编程核心,用于处理IO阻塞操作(数据库查询、接口请求、文件读写)。原理:异步方法执行到await时,会释放当前线程,线程可以去处理其他请求,等待IO操作完成后,再恢复线程继续执行后续代码,不会阻塞线程,极大提升服务器并发处理能力。同步方法会一直占用线程,等待操作完成才能释放,高并发场景下容易出现线程阻塞、请求排队、接口超时问题。2、Task和Thread的区别?参考答案:1)Thread是操作系统级别的线程,粒度大、开销高,生命周期需要手动管理,适配老旧多线程场景;2)Task是线程池封装的任务,基于线程池实现,复用线程池线程,减少线程创建销毁开销,支持取消、等待、异常捕获、链式调用,是现代.NET异步开发的主流方式。3、简述线程安全问题,以及常用解决方式?参考答案:多线程同时操作共享变量、共享资源时,会出现数据覆盖、数据错乱、结果异常的问题,就是线程安全问题。常用解决方案:1)使用lock锁,锁定共享代码块,保证同一时间只有一个线程执行;2)使用Interlock原子操作,处理简单数值增减;3)使用线程安全集合(ConcurrentQueue、ConcurrentDictionary);4)尽量避免共享变量,采用局部变量、无状态编程。六、项目性能优化与实战问题1、日常开发中.NET接口常用的性能优化手段?参考答案:1)数据库优化:合理建索引、避免select*、分页查询、杜绝N+1查询、批量操作替代逐条操作;2)代码优化:使用StringBuilder拼接字符串、泛型集合、减少装箱拆箱、避免循环内创建对象;3)缓存优化:引入Redis缓存热点数据、内存缓存,减少数据库查询压力;4)异步优化:IO操作全部使用async/await异步编程,提升并发量;5)资源优化:using释放非托管资源、杜绝内存泄漏、精简不必要的日志和逻辑;6)响应优化:统一分页、精简返回字段,避免返回冗余数据。2、Redis在.NET项目中的常用使用场景?参考答案:1)热点数据缓存:缓存首页数据、字典数据、配置数据、商品数据,减少数据库访问;2)登录会话存储:存储用户Token、登录状态,实现分布式登录;3)接口限流、防重复提交:通过Redis键过期机制实现;4)分布式锁:解决多服务并发争抢资源问题;5)计数器、排行榜、临时数据存储。3、如何排查接口超时、CPU占用高、内存暴涨问题?参考答案:1)接口超时:查看日志定位慢接口,排查数据库慢SQL、未加索引、循环查库、同步阻塞逻辑;2)CPU过高:排查死循环、频繁GC、大量同步阻塞、正则匹配耗时、复杂计算逻辑;3)内存暴涨:排查内存泄漏,重点检查静态集合、未释放的资源、事件未取消、大对象未回收,通过日志和内存分析工具定位未释放对象。七、面试手写简答(实操问答)1、说一说你对RESTful接口规范的理解?参考答案:RESTful是统一的接口设计规范,通过HTTP请求方式定义操作行为,接口地址使用名词,不使用动词。GET:查询数据;POST:新增数据;PUT:全量修改数据;PATCH:局部修改;DELETE:删除数据。接口地址语义清晰、统一返回格式、状态码规范,便于前后端协作和接口维护。2、全局异常过滤器的作用是什么?项目中如何使用?参考答案:全局异常过滤器可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (2026版)中医护理学基础试题试卷及答案
- 酒店服务质量与收益绩效考核表
- 个人园艺师植物多样性培育成效考核表
- 立体仓库货架维护与保养指南
- 2026年新市场拓展预期报告确认函3篇
- 2026年宁波市教育科学研究所公开招聘心理指导教师1人考试参考题库及答案解析
- 2027届顺德国资国企校园招聘笔试模拟试题及答案解析
- 申请材料缺失催办函(4篇)
- 合作框架合同签订信4篇范本
- 2026北京市顺义区消防救援支队政府专职消防员招录50人笔试备考题库及答案解析
- 水库施工便道合同
- 质量文化导论(华东理工大学)知到智慧树章节答案
- 年产35000套玻璃钢雕塑新建项目环评资料环境影响
- 国家电网有限公司新一代电子商务平台(ECP20)操作手册-省公司合同管理-供应商操作分册
- 第四届全国工业设计职业技能大赛(玩具设计师)选拔赛考试题库(含答案)
- 室外消火栓施工方案
- NB-T47023-2012长颈对焊法兰
- DB32T 4627-2023 城市隧道通风设计标准
- 桥架的安装与施工桥架安装注意事项i
- 2023年广东南航明珠优才管培生计划招聘笔试参考题库附带答案详解
- 圆柱弹簧通用作业指导书
评论
0/150
提交评论