版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.NET高频面试题及详细答案(实战版)说明:本套试题整理自企业真实一线面试场景,涵盖.NET基础、C#进阶、CLR、多线程、EF、ASP.NETCore、数据库及项目实操问题,答案贴合开发实战,规避理论化空洞表述,适合中级、高级.NET开发求职面试备考。一、C#基础核心面试题1.详细说说值类型和引用类型的区别,以及实际开发中的使用场景参考答案:值类型主要存储在栈内存中,常见的有int、double、bool、struct、枚举等。值类型变量存储的是数据本身,变量赋值时会直接拷贝一份完整数据,两个变量相互独立,修改其中一个不会影响另一个。栈内存由系统自动申请、自动释放,执行效率高。引用类型主要存储在堆内存中,常见的有string、class、数组、集合、自定义类等。引用类型变量存储的是内存地址,而非数据本身,赋值时只是拷贝内存地址,多个变量指向同一个堆内存对象,修改任意一个变量的对象数据,其他引用该对象的变量都会同步变化。堆内存需要GC垃圾回收机制回收。实战场景:简单数值、状态标识、轻量数据结构用值类型;需要多次复用、传递、修改的复杂业务对象、实体类、数据集合全部用引用类型。2.string和StringBuilder的区别?为什么字符串拼接多了要用StringBuilder?参考答案:string是不可变字符串,一旦初始化赋值,内存中的内容就无法修改。每次使用+、+=拼接字符串时,都会重新在堆内存开辟新空间,生成新的字符串对象,旧对象会等待GC回收。如果循环中频繁拼接字符串,会产生大量临时垃圾对象,造成内存浪费、程序卡顿。StringBuilder是可变字符串,底层维护一个字符缓冲区,拼接、插入、删除字符串时,不会频繁创建新对象,直接在原有缓冲区修改内容,仅在缓冲区容量不足时才会扩容,极大减少了内存开销和对象创建损耗。使用场景:少量固定字符串拼接直接用string;循环拼接、批量拼接、动态组装长文本必须用StringBuilder。3.const和readonly的区别?参考答案:1.赋值时机不同:const是编译时常量,必须在声明时直接赋值,编译后值固定无法修改;readonly是运行时常量,可以在声明时赋值,也可以在类的构造函数中动态赋值。2.修饰范围不同:const只能修饰字段、局部变量,不能修饰属性;readonly仅能修饰类字段。3.访问方式不同:const默认是静态的,直接通过类名访问,无需实例化;readonly可以是实例字段也可以是静态字段,实例字段需要对象访问。4.内存机制不同:const常量编译后会直接嵌入代码,无内存开销;readonly常量会占用内存空间。4.说说ref和out关键字的用法与核心区别参考答案:两者都是用来实现方法参数按地址传递,直接修改实参数据,而非值拷贝。核心区别:1.初始化要求不同:ref参数要求实参必须提前初始化赋值,方法内可以读取、修改参数;out参数实参无需提前赋值,但方法内部必须对out参数完成赋值,否则编译报错。2.使用场景不同:ref适合需要传入初始值、方法内修改后传出的场景;out适合方法需要返回多个结果值的场景,比如int.TryParse就是典型的out参数用法。二、.NET进阶与CLR面试题1.简述.NET的GC垃圾回收机制,以及GC的回收流程参考答案:GC是.NET的自动内存回收机制,主要负责回收堆内存中不再被使用的对象,避免内存泄漏,开发者无需手动释放内存。GC不会回收栈内存,仅针对引用类型的堆内存对象。GC采用分代回收策略,将对象分为0代、1代、2代:0代:最新创建的对象,空间小、回收频率最高,大部分临时对象都在0代回收;1代:0代回收后存活的对象,作为缓冲区域,回收频率较低;2代:长期存活的全局对象、静态对象,回收频率最低,耗时最长。回收流程:首先标记所有存活对象(从根对象遍历,根对象包括静态变量、栈变量、CPU寄存器),再清除未标记的垃圾对象,最后整理内存碎片、压缩内存,将存活对象向内存前端移动,保证内存连续性。2.什么是内存泄漏?.NET中常见的内存泄漏场景有哪些?参考答案:内存泄漏指对象已经完成业务逻辑、不再被程序使用,但因为存在有效引用,GC无法回收该对象,导致内存持续占用、无法释放,长期运行会造成内存溢出、程序崩溃。常见泄漏场景:1.静态集合、静态列表持续添加数据,未手动清空,静态变量生命周期贯穿程序全程,对象永远无法被回收;2.事件订阅未取消,比如控件事件、自定义事件订阅后,对象销毁但事件引用存在;3.长生命周期对象引用短生命周期对象,导致短对象无法释放;4.文件流、数据库连接、网络套接字等资源未手动释放,未使用using语句;5.缓存无过期策略、无淘汰机制,数据无限堆积。3.using语句的作用和原理是什么?参考答案:using主要用于释放实现了IDisposable接口的资源,包括文件流、数据库连接、网络请求、内存流等非托管资源。编译原理:using语句在编译后会自动生成try-finally代码块,try块执行业务逻辑,finally块中强制执行Dispose()方法,无论代码正常执行还是出现异常,都会自动释放资源,避免资源泄露。日常开发中,所有操作非托管资源的对象,都必须用using包裹,保证资源及时释放。三、多线程与异步编程面试题1.同步、异步、多线程的区别?参考答案:同步:代码按顺序自上而下执行,上一个方法执行完毕,才会执行下一个,当前线程会阻塞等待,优点是逻辑简单、不易出错,缺点是耗时操作会卡住程序。异步:基于任务和回调机制,耗时操作启动后,不会阻塞当前线程,线程可以继续处理其他业务,等待耗时操作完成后再执行后续逻辑,提升程序吞吐量。多线程:开辟多个线程并行执行任务,利用多核CPU提升执行效率,适合CPU密集型任务;但线程创建、销毁有开销,且多线程存在线程安全、资源竞争问题。实战选型:IO密集型(接口请求、数据库查询、文件读写)用异步async/await;CPU密集型(数据计算、解析、批量处理)用多线程并行。2.async/await的工作原理?会不会开启新线程?参考答案:async/await是基于任务的异步语法糖,底层依托Task实现,本质是状态机模式,编译器会将异步方法拆分为多个状态节点,执行到await时暂停当前方法,释放当前线程,等待任务完成后,再恢复线程继续执行后续代码。await不会主动开启新线程,大部分IO异步操作全程无新线程,只是释放原有线程;只有部分CPU密集型任务,才会复用线程池线程执行。很多开发者误以为异步就是多线程,这是核心误区。3.什么是线程安全?如何解决多线程并发问题?参考答案:线程安全指多线程同时操作共享资源(静态变量、全局变量、集合)时,不会出现数据错乱、数据覆盖、逻辑异常的情况。单线程不存在线程安全问题,多线程并发读写共享资源时极易出现问题。常用解决方案:1.lock锁:锁定共享代码块,保证同一时间只有一个线程执行,简单易用,适合常规并发场景;2.Monitor监视器:比lock更灵活,可以手动控制加锁、解锁,支持超时设置;3.线程安全集合:使用ConcurrentList、ConcurrentDictionary等内置线程安全集合;4.避免共享变量:尽量使用局部变量,从根源杜绝并发问题。四、ASP.NETCore面试题1.简述ASP.NETCore管道模型和中间件执行流程参考答案:ASP.NETCore采用请求管道模型,所有的HTTP请求都会按照注册顺序,依次经过多个中间件处理,处理完成后再反向响应返回客户端。中间件是管道的核心组件,每个中间件既可以处理请求,也可以处理响应,还可以将请求传递给下一个中间件。执行流程:客户端发起请求→路由中间件→身份认证中间件→授权中间件→业务控制器执行→结果返回→反向经过各级中间件处理响应→响应到客户端。中间件注册顺序至关重要,先注册的先执行、后响应,开发中认证、授权、跨域等通用中间件需提前注册。2.依赖注入(DI)的作用和三种生命周期区别参考答案:依赖注入是ASP.NETCore的核心特性,通过容器自动管理对象的创建、依赖、销毁,无需手动new对象,降低代码耦合度,方便单元测试、代码维护和替换实现类。三种生命周期:1.Transient(瞬时):每次请求获取对象时,都会创建全新实例,生命周期最短,适合轻量、无状态服务;2.Scoped(作用域):同一个HTTP请求内,全局唯一实例,请求结束后对象销毁,是业务服务最常用的生命周期;3.Singleton(单例):程序启动后创建一次,全程程序生命周期内唯一,所有请求共享同一个实例,适合全局配置、工具类服务,需保证线程安全。3.说说跨域问题的产生原因和ASP.NETCore解决跨域的方式参考答案:跨域是浏览器的安全限制,当前页面的域名、端口、协议与请求接口不一致时,浏览器会拦截请求,产生跨域报错。跨域是前端浏览器限制,和后端服务无关。ASP.NETCore解决方式:通过内置CORS中间件,在Program中配置允许的域名、请求方法、请求头,支持允许所有域名、指定域名、允许携带Cookie等配置,配置完成后即可正常跨域请求。五、EFCore与数据库面试题1.EFCore中FirstOrDefault、SingleOrDefault、Find的区别参考答案:FirstOrDefault:查询符合条件的第一条数据,无数据返回默认值,多条数据不报错,日常查询单条数据最常用;SingleOrDefault:查询符合条件的唯一一条数据,无数据返回默认值,存在多条数据直接报错,适合需要保证数据唯一的场景;Find:根据主键查询数据,优先从EF上下文缓存中查询,缓存有直接返回,无数据再查数据库,查询效率高于前两者,仅支持主键查询。2.什么是懒加载和急加载?EFCore如何实现?参考答案:懒加载:查询主表数据时,不查询关联子表数据,访问关联属性时才单独查询数据库,优点是减少单次查询压力,缺点是频繁访问关联数据会产生多次SQL查询,造成性能问题;急加载:通过Include、ThenInclude提前加载关联表数据,一次SQL查询带出所有关联数据,避免重复查库,适合需要批量读取关联数据的场景。EFCore默认关闭懒加载,如需使用需单独配置,实际项目开发中优先使用急加载,把控SQL执行效率。3.项目中如何优化EFCore查询性能?参考答案:1.避免全表查询,使用Where、Take、Skip分页筛选数据,减少查询行数;2.只查询需要的字段,不用Select*,按需投影字段;3.关联查询使用Include急加载,杜绝循环查库;4.频繁查询的数据添加数据库索引;5.批量新增、修改、删除使用EFCore批量操作,避免循环逐条操作;6.合理使用AsNoTracking,查询只读数据时关闭实体跟踪,提升查询速度。六、项目实战与手写逻辑面试题1.说说你项目中遇到的高并发场景及解决方案参考答案:项目中常见的高并发场景有商品秒杀、订单创建、接口高频查询、数据统计等,高并发容易出现超卖、数据重复、接口卡顿、数据库压力过大等问题。常用解决方案:1.接口层面:做接口限流、防重复提交,通过分布式锁控制同一资源的并发操作;2.缓存优化:热点数据存入Redis,减少数据库查询压力;3.数据库优化:添加索引、读写分离、分表分库,优化SQL语句;4.异步削峰:高频非实时业务通过队列异步处理,缓解瞬时并发压力;5.数据一致性:核心业务使用事务、乐观锁、悲观锁保证数据准确。2.简单手写单例模式(线程安全版)参考答案:csharp
publicclassSingleton
{
//私有静态实例
privatestaticSingleton_instance;
//锁对象
privatestaticreadonlyobject_lockObj=newobject();
//私有构造函数,禁止外部实例化
privateSingleton(){}
//双重校验锁线程安全单例
publicstaticSingletonGetInstance()
{
if(_instance==null)
{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年育婴员(婴幼儿护理与行为引导)试卷及答案
- 2025年院感知识竞赛题库(附答案)
- 2025年职业病防治专业常识考核试题及答案解析
- 2025年执业医师定期考核真题库含答案
- 2025年主管护师《专业实践能力》新版真题卷(附每题答案)
- 2026年湖南省“安全生产月”知识竞赛竞答试题及参考答案
- 2026版多发性骨髓瘤诊疗管理指南培训试题及答案
- 山东省济南市第一中学九年级化学第5章模拟试卷及答案
- 2026年湖南省湘教版初中生物四年级下册第11单元生物进化练习题及答案
- 2026供应链金融发展分析及创新模式与投资机会研究报告
- 二手房买卖合同范本下载可打印
- 《西式烹饪工艺》课件-炸薯条
- 工业设计专业职业生涯规划
- 青岛版 小学 信息技术 四年级下册 课程纲要 学历案
- 工业设计技术-Geomagic Design X 逆向设计实用教程 课件 项目5、6 遥控器建模、连杆建模
- 自有房产未取得不动产权属证书证明
- 桥梁现浇箱梁模板支架验收记录表
- 第九章分类系统与进化谱系
- 九年级上册反比例函数作业设计
- GB/T 36129-2018珠宝玉石鉴定阴极发光图像法
- GB/T 13452.2-2008色漆和清漆漆膜厚度的测定
评论
0/150
提交评论