版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.NET高频面试题及详细真实答案(实战版)一、C#基础语法与核心特性1、值类型和引用类型的区别?日常开发常见类型有哪些?参考答案:两者核心区别是内存存储位置、赋值方式、生命周期完全不同。值类型:数据直接存储在栈内存,赋值是完整拷贝,两个变量互不影响,出作用域立刻释放内存。常见:int、double、bool、struct、enum、decimal。引用类型:栈中只存内存地址,真实数据存在堆内存,赋值是地址拷贝,多个变量指向同一个堆对象,改一个全会变,由GC回收内存。常见:string、class、数组、集合(List、Dictionary)、自定义类。面试加分点:string是特殊引用类型,具备不可变性,每次赋值本质是新建对象。2、string、StringBuilder、StringBuffer的区别?项目中怎么选用?参考答案:1、string:不可变字符串,每次拼接、修改都会生成新对象,频繁操作会产生大量垃圾内存,性能差。适合少量固定字符串场景。2、StringBuilder:.NET专属,可变字符串,预分配缓冲区,拼接不新建对象,性能极高。适合循环拼接、大量字符串组装(日志、报文、导出文本)。3、StringBuffer:Java专属,.NET没有,面试常被对比,不用混淆。实战总结:单次赋值用string,循环/批量拼接必用StringBuilder。3、const和readonly、staticreadonly的区别参考答案:1、const:编译时常量,编译时直接替换值,必须声明时赋值,属于类级别,不能通过对象访问,跨程序集引用会硬编码值。2、readonly:运行时常量,构造函数中可以赋值,只能赋值一次,对象级别,每个实例独立。3、staticreadonly:静态只读,静态构造函数赋值,类级别全局唯一,跨程序集不会硬编码,适合配置常量、枚举映射、接口地址。项目用法:固定不变的数字用const;运行时初始化、跨程序集的常量用staticreadonly。4、ref和out关键字的区别参考答案:相同点:都是通过地址传递,方法内修改会影响外部变量。不同点:1、ref:参数必须先初始化赋值,方法内可改可不改,多用于双向传值修改。2、out:参数不用提前赋值,方法内必须赋值,多用于方法多返回值场景。实战场景:out常用于int.TryParse、Dictionary.TryGetValue这类容错返回。二、面向对象OOP核心1、面向对象三大特性,结合项目举例说明参考答案:封装:隐藏内部细节,只暴露可用接口。比如实体类私有字段,通过public属性对外访问,控制数据赋值合法性。继承:代码复用,子类复用父类属性和方法。项目中写BaseService、BaseController,统一封装公共查询、异常处理、日志,所有业务类继承。多态:同一方法不同实现,分为重写和重载。比如父类定义统一校验方法,用户模块、订单模块子类重写各自的校验逻辑,统一调用入口。2、override和new的区别参考答案:1、override:重写父类virtual方法,多态生效,父类引用指向子类对象时,执行子类重写逻辑。2、new:隐藏父类方法,无多态,父类引用调用执行父类方法,子类引用调用子类方法,属于语法覆盖,不推荐滥用。实战原则:需要统一多态逻辑用override,尽量不用new。3、抽象类(abstract)和接口(interface)的区别参考答案:1、抽象类:可以有字段、属性、构造函数、已实现方法和抽象方法,单继承,侧重代码复用,定义通用模板。2、接口:只能定义方法、属性、事件(无字段),默认公共,多实现,侧重行为规范,定义能力标准。项目场景:公共逻辑复用用抽象基类;统一行为标准(如IDelete、IExport)用接口。三、CLR、GC与内存机制1、.NET托管和非托管的区别参考答案:托管代码:由CLR管理内存、线程、异常,自动GC回收,开发效率高,日常C#业务代码都是托管。非托管代码:不受CLR管控,内存需要手动释放,比如操作文件流、数据库连接、Socket、第三方C++dll。非托管资源必须手动释放,依靠IDisposable接口+using语句自动释放,避免内存泄漏。2、GC垃圾回收机制、回收时机、分代回收原理参考答案:GC只回收堆内存托管对象,栈内存自动释放。分代回收(0、1、2代):0代:新建短期对象,回收频率最高,空间小,回收速度快。1代:0代存活对象晋升,作为缓冲,回收次数少。2代:长期存活对象(全局静态、缓存),回收频率极低,耗时最长。触发时机:新对象分配堆内存不足、主动调用GC.Collect、程序退出。实战注意:禁止手动频繁调用GC.Collect,会打乱GC策略,导致性能卡顿。3、using原理、IDisposable接口作用参考答案:using是语法糖,编译后会自动生成try-finally代码,无论代码是否报错,最终都会执行Dispose方法释放非托管资源。IDisposable是释放非托管资源的标准接口,文件流、数据库连接、HttpClient、MemoryStream全部实现该接口。项目中自定义需要释放资源的类,必须实现IDisposable,避免句柄泄漏。四、多线程、异步与并发1、同步、异步、多线程的区别?什么时候用async/await?参考答案:同步:代码顺序执行,卡等阻塞,效率低。多线程:开辟新线程并行执行,解决CPU密集任务,线程开销大,上下文切换耗性能。异步(async/await):不阻塞线程,释放线程去处理其他请求,等待IO完成再回调,专门解决IO密集任务(数据库、接口、文件读写)。实战选型:IO操作全部用async/await;大数据计算、循环解析用多线程/并行。2、Task和Thread的区别参考答案:1、Thread:操作系统级线程,开销大,无法灵活控制,无返回值,底层API,现在基本不用。2、Task:基于线程池封装,轻量,支持取消、超时、回调、链式调用、异常聚合,是.NET主流异步方案。简单说:Thread是底层线程,Task是任务包装,效率更高、可控性更强。3、线程安全问题怎么解决?lock、Monitor、Mutex区别参考答案:多线程同时读写共享变量会出现数据错乱,需要加锁。lock:语法糖,简化版Monitor,最常用,进程内锁,代码简洁,适合普通并发场景。Monitor:底层锁,可手动加锁、解锁、等待,比lock灵活。Mutex:跨进程锁,可限制多程序同时执行同一逻辑,比如单程序启动限制。项目中绝大多数并发场景,直接用lock即可。五、.NETCore/.NET框架核心1、.NETFramework和.NETCore/.NET5+的核心区别参考答案:1、跨平台:Framework仅Windows;.NETCore/.NET6+支持Windows、Linux、Mac。2、轻量高性能:摒弃冗余程序集,启动更快、内存占用更低、并发更强。3、部署方式:Framework依赖系统全局安装;.NETCore支持独立部署,无需安装环境。4、开源跨平台、模块化、适配微服务、容器Docker部署。2、ASP.NETCore中间件的执行原理,管道模型参考答案:ASP.NETCore是管道模型,请求进来依次经过注册的中间件,每个中间件可以处理请求、响应,也可以转交下一个中间件。执行顺序:注册顺序从上到下进管道,响应时从下到上回传。常用中间件:路由、授权、跨域、静态资源、异常处理、日志。和Framework的区别:Core中间件完全自定义,管道灵活可控,废弃了HTTP模块、HTTP处理器复杂模型。3、依赖注入(DI)原理和三种生命周期参考答案:DI核心:解耦,不手动new对象,由框架统一创建、管理、释放对象,方便单元测试、替换实现。三种生命周期:1、Transient(瞬时):每次请求获取都是新对象,最轻量,适合工具类、服务层。2、Scoped(作用域):一次HTTP请求同一个对象,不同请求不同对象,业务服务最常用。3、Singleton(单例):全局程序唯一对象,程序启动创建,永久复用,适合配置、全局缓存。避坑点:单例不能注入Scoped对象,会出现生命周期不匹配报错。六、EFCore数据库实战1、EFCore延迟加载和立即加载区别,怎么避免N+1问题?参考答案:延迟加载:默认不加载关联表数据,访问导航属性时才单独查库,容易出现N+1查询(查1次主表,N条子表),性能极差。立即加载:通过Include、ThenInclude主动关联查询,一次SQL查出所有数据,避免多次查库。实战优化:多表关联查询一律手动Include,禁止依赖延迟加载。2、EFCore事务使用场景、隐式事务和显式事务参考答案:隐式事务:单次SaveChanges自带事务,要么全部成功、要么全部回滚。显式事务:多个SaveChanges、多表操作、跨步骤修改,需要手动开启事务,保证整体原子性。项目中转账、订单创建、库存扣减等核心业务,必须手动开启事务。七、Web接口与前后端交互1、GET和POST区别,面试高频误区纠正参考答案:1、传参方式:GET参数拼接URL,POST请求体传参。2、缓存:GET可缓存,POST默认不缓存。3、长度限制:GET受浏览器URL长度限制,POST无限制。4、安全性:都不安全,GET参数暴露地址栏,相对更差,敏感数据必须加密,不能靠请求方式保安全。5、语义:GET查询数据,POST提交修改数据。2、跨域问题产生原因及.NETCore解决方案参考答案:浏览器同源策略限制:协议、域名、端口任意一个不同,就是跨域,浏览器拦截响应。.NETCore解决:注册CORS跨域中间件,配置允许域名、允许方法、允许请求头,全局启用或特性启用。注意:开发环境允许所有跨域,生产环境必须指定具体域名,不能全开。八、性能优化与项目实战问题1、.NET项目常见性能瓶颈和优化手段参考答案:1、数据库:加索引、避免N+1、分页查询、禁止select*、事务精简、读写分离。2、代码层面:循环拼接用StringBuilder、减少装箱拆箱、避免频繁new对象、using释放资源。3、缓存优化:热点数据用Redis缓存、本地缓存,减少数据库查询。4、异步优化:IO操作全部async/await,释放线程,提升并发量。5、GC优化:避免大对象、避免频繁创建短期大对象、减少内存泄漏。2、内存泄漏常见场景及排查思路参考答案:常见泄漏:未释放非托管资源、静态集合无限累加、事件订阅未取消、HttpClient频繁创建、缓存不淘汰。排查方式:通过VS性能探查器、内存快照、监控GC回收情况,定位常驻内存对象。解决方案:using托管释放、定时清理静态缓存、使用HttpClientFactory、及时解绑事件。九、面试手写/实操简答题1、简述HttpClient为什么不建议频繁new?正确用法是什么?参考答案:频繁newHttpClient会创建大量底层Http连接句柄,不会及时释放,导致端口耗尽、套接字泄漏。正确用法:.NETCore中使用HttpClientFactory注入,框架
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业员工个人绩效评估表
- 能源投资机会分析师绩效评定表
- 教育课程研发经理绩效衡量表
- 阿坝州12345政务服务热线服务中心招聘(2人)笔试备考试题及答案解析
- 化工企业生产安全管理员工作KPI考核表
- 关于产品推广策略调整的商洽函(4篇)
- 2026年中国烟草总公司云南省公司人员招聘考试模拟试题及答案
- 技术开发工程师绩效评定考核表
- 关于2026年年度报告的邀请函3篇范文
- 2025~2026学年湖南岳阳县第一中学度第二学期期末高一英语试卷
- 医学影像学神经系统疾病课件
- 英语-全国天域名校协作体2027届高三10月联考
- 2.5 口腔里的消化 课件(内嵌视频)2026-2027学年科学四年级上册教科版
- 小学三年级劳动教育《交通指挥有学问》教学设计
- 07SD101-8电力电缆井图集
- 2026 年教师师德师风建设专题学习课件
- 2026苏教版小学六年级科学上册(全册)每课课时练习及答案
- 2025-2026学年人教版九年级数学上册期中提优测评试卷(含答案)
- 统编版八年级语文上册第三单元《课外古诗词诵读》学习任务单
- 注册消防工程师继续教育2025年部分题目与答案(126题)
- AI在不良资产处置智能化中的应用探索
评论
0/150
提交评论