NET + SQL 高频面试题及详细答案(实战版)_第1页
NET + SQL 高频面试题及详细答案(实战版)_第2页
NET + SQL 高频面试题及详细答案(实战版)_第3页
NET + SQL 高频面试题及详细答案(实战版)_第4页
NET + SQL 高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

.NET+SQL高频面试题及详细答案(实战版)一、.NET基础面试题1.简述C#值类型和引用类型的区别,并举例说明参考答案:值类型数据直接存储在栈内存中,变量存储的是数据本身,赋值操作是完整拷贝一份数据,两个变量相互独立,修改其中一个不会影响另一个。值类型不需要手动释放内存,栈内存由系统自动回收。常见值类型:int、double、bool、char、struct、枚举等。引用类型数据存储在堆内存中,变量存储的是堆内存的地址引用,而非数据本身。多个引用变量可以指向同一个堆内存对象,修改任意一个变量指向的对象数据,所有指向该对象的变量取值都会同步变化。堆内存由GC垃圾回收机制统一回收。常见引用类型:string、class、数组、集合(List、Dictionary)、自定义类等。实战补充:string是特殊的引用类型,具备不可变性,重新赋值时会生成新的内存对象,不会修改原内存数据。2.详细说说C#中const和readonly的区别参考答案:1.赋值时机不同:const是编译时常量,必须在声明时直接赋值,编译后值固定不可修改;readonly是运行时常量,可以在声明时赋值,也可以在类的构造函数中赋值,实例构造函数对应实例readonly,静态构造函数对应静态readonly。2.修饰范围不同:const只能修饰字段,不能修饰局部变量、属性;readonly仅能修饰类字段。3.访问方式不同:const默认是静态的,无需实例化类即可访问;readonly分为实例和静态,实例readonly必须通过类实例访问,静态readonly通过类名访问。4.内存机制不同:const常量编译后会直接嵌入代码,无内存开销;readonly会在运行时分配内存存储数值。使用场景:固定不变的全局常量(如固定参数值、配置常量)用const;需要根据构造实例动态初始化、运行时固定的值用readonly。3.简述ArrayList和List<T>的区别参考答案:1.类型安全:ArrayList是非泛型集合,存储数据默认是object类型,装箱拆箱频繁,且无法约束数据类型,运行时容易出现类型转换异常;List<T>是泛型集合,编译时约束数据类型,类型安全,无类型转换报错风险。2.性能差异:ArrayList存储值类型时会发生装箱,读取时拆箱,产生大量性能开销;List<T>直接存储指定类型数据,无需装箱拆箱,性能远高于ArrayList。3.版本适配:ArrayList是.NET1.1早期产物,现在基本被淘汰;List<T>是.NET2.0泛型推出后的主流集合,日常开发全部使用List<T>。4.方法功能:List<T>封装了更多实用扩展方法,支持LINQ查询,操作更便捷。4.什么是装箱和拆箱?简述原理及性能影响参考答案:装箱:将值类型转换为引用类型(object)的过程,系统会在堆内存中开辟空间,拷贝值类型数据,生成引用对象。拆箱:将引用类型(object)转回对应值类型的过程,需要强制类型转换,从堆内存中读取数据拷贝到栈内存。核心原理:值类型栈内存→装箱分配堆内存→拆箱读取堆内存数据。性能影响:装箱拆箱会产生内存分配、数据拷贝开销,频繁操作会导致程序性能下降。日常开发中,泛型集合、泛型方法的核心作用之一就是规避装箱拆箱问题。5.说说.NET中GC垃圾回收机制参考答案:GC是.NET自动管理堆内存的机制,主要负责回收不再被引用的对象,释放堆内存空间,避免内存泄漏,开发者无需手动申请和释放堆内存。1.回收对象:仅针对引用类型对象,栈内存由系统自动管理,GC不干预。2.分代回收机制:GC将对象分为0代、1代、2代。0代是新建的短期对象,回收频率最高、速度最快;1代是0代回收后留存的对象;2代是长期存活的对象,回收频率最低、耗时最长。3.回收时机:0代内存不足、主动调用GC.Collect()、程序退出时触发回收。不建议手动强制触发GC,会打乱自动回收策略,影响性能。4.内存压缩:GC回收内存后,会整理剩余存活对象,压缩堆内存,减少内存碎片。常见问题:静态变量、全局引用、事件订阅未解绑会导致对象无法被GC回收,造成内存泄漏。6.简述ASP.NETCore中间件的执行原理参考答案:中间件是ASP.NETCore处理HTTP请求的核心组件,本质是一系列委托链,请求进入系统后,会按照注册顺序依次经过各个中间件,响应时反向执行,形成管道模型。每个中间件都包含两个逻辑:请求处理逻辑、响应回溯逻辑,通过Next()方法调用下一个中间件。如果不调用Next(),请求会直接终止,直接返回响应。常用内置中间件:路由、跨域、静态文件、授权、异常处理等。核心特点:注册顺序决定执行顺序,自定义中间件可灵活拦截请求、校验参数、统一日志、异常处理,适配业务通用逻辑。二、.NET进阶面试题1.异步await/async的原理,为什么能提升性能参考答案:async/await是.NET异步编程的语法糖,底层基于Task任务模型实现,核心是不阻塞线程。同步编程中,执行IO操作(数据库查询、接口请求、文件读写)时,线程会阻塞等待,期间线程闲置,无法处理其他请求,造成资源浪费。异步编程中,遇到await修饰的IO任务时,线程会释放,回到线程池继续处理其他客户端请求;待IO操作完成后,线程池重新分配线程执行后续代码。性能提升核心:极大提高线程复用率,提升系统并发能力,相同服务器资源下,可承载更多请求,并非提升单次请求执行速度。注意点:纯CPU密集型任务使用async/await无法提升性能,反而会增加任务调度开销,IO密集型任务是最佳使用场景。2.谈谈EFCore延迟加载和立即加载的区别,以及使用场景参考答案:1.立即加载(EagerLoading):使用Include、ThenInclude提前加载关联实体,查询主数据时,一次性通过SQL查询加载关联表数据,单次数据库交互完成。适用场景:明确需要使用关联数据,避免多次查库,减少数据库请求次数。2.延迟加载(LazyLoading):查询主数据时,仅查询主表数据,关联数据不加载;代码访问关联属性时,才单独发起SQL查询加载数据。EFCore默认关闭延迟加载,需要手动配置引用。适用场景:不确定是否需要关联数据,避免加载冗余数据,节省内存。常见坑:延迟加载容易产生N+1查询问题,查询N条主数据后,循环访问关联数据会触发N次额外查询,频繁访问数据库,严重影响性能,批量查询场景优先使用立即加载。3..NET中接口和抽象类的区别参考答案:1.成员定义:抽象类可以包含字段、属性、构造函数、普通方法、抽象方法;接口只能定义方法、属性、事件索引器,不能有字段和构造函数,默认成员都是公共的。2.继承限制:类只能单继承一个抽象类,但可以多实现多个接口。3.实现规则:抽象类中可以有已实现的具体方法,也有未实现的抽象方法,派生类必须重写所有抽象方法;接口所有成员默认无实现(默认接口方法除外),实现类必须实现所有接口成员。4.版本兼容:新增抽象方法会导致所有派生类报错,必须统一重写;接口可通过默认接口方法兼容旧版本,不影响原有实现类。使用场景:需要统一子类公共字段、构造逻辑、通用方法用抽象类;需要定义行为规范、实现多态解耦、扩展功能用接口。三、SQL基础面试题1.简述SQL事务的四大特性(ACID)参考答案:1.原子性(Atomicity):事务是最小执行单元,不可拆分,事务内所有操作要么全部成功提交,要么全部失败回滚,不会出现部分执行的情况。2.一致性(Consistency):事务执行前后,数据库数据完整性约束不变,数据始终处于合法状态,不会出现脏数据、异常数据。例如转账场景,总金额前后保持一致。3.隔离性(Isolation):多个事务并发执行时,相互独立互不干扰,不同事务的操作不会互相影响,通过隔离级别控制并发冲突。4.持久性(Durability):事务提交成功后,数据会永久写入数据库,即使服务器断电、重启,数据也不会丢失。2.数据库三范式是什么?实际开发中是否必须严格遵守?参考答案:1.第一范式(1NF):列不可再分,每个字段存储单一原子数据,不能存在复合数据、多值数据。2.第二范式(2NF):满足1NF,且所有非主键字段完全依赖主键,不存在部分依赖,消除联合主键的部分依赖问题。3.第三范式(3NF):满足2NF,且非主键字段之间不存在依赖关系,所有字段直接依赖主键,消除传递依赖。开发实战说明:不需要严格遵守三范式。三范式核心是减少数据冗余,但会导致表拆分过细,查询需要多表关联,降低查询性能。实际开发中,为了提升查询效率,会适当冗余字段,以空间换时间,兼顾数据冗余和查询性能。3.内连接、左连接、右连接、全连接的区别参考答案:假设有A表、B表,关联字段匹配查询:1.内连接(INNERJOIN):只查询两张表中关联字段匹配成功的数据,匹配失败的数据全部过滤,是最常用的连接方式。2.左连接(LEFTJOIN):以左表为基准,查询左表所有数据,右表匹配成功则显示对应数据,匹配失败则右表字段显示NULL。3.右连接(RIGHTJOIN):以右表为基准,查询右表所有数据,左表匹配成功显示数据,失败则左表字段显示NULL。4.全连接(FULLJOIN):查询左右两表所有数据,匹配成功显示完整数据,任意一方匹配失败,缺失字段显示NULL。4.UNION和UNIONALL的区别参考答案:1.去重差异:UNION会自动去除查询结果中的重复数据;UNIONALL直接拼接所有结果,不去重。2.性能差异:UNION需要额外执行排序、去重逻辑,性能较慢;UNIONALL无额外运算,性能远高于UNION。3.使用场景:数据无重复、追求查询速度优先用UNIONALL;需要自动去重的场景使用UNION。通用规则:开发中优先使用UNIONALL,业务需要去重再用UNION。四、SQL进阶面试题(索引、优化、锁)1.什么是聚集索引和非聚集索引?区别是什么?参考答案:1.聚集索引:数据表数据物理存储顺序和索引顺序一致,一张表只能有一个聚集索引,通常主键默认就是聚集索引。聚集索引叶子节点存储的是完整的整行数据。2.非聚集索引:索引顺序和数据物理存储顺序无关,一张表可以创建多个非聚集索引。非聚集索引叶子节点存储的是索引字段值和聚集索引键,查询数据时需要通过索引键回表查询完整数据。核心区别:聚集索引直接存储整行数据,查询速度快;非聚集索引需要回表查询,存在索引查找开销,但可以灵活创建多个,适配不同查询条件。2.索引失效的常见场景有哪些?参考答案:日常开发中高频索引失效场景:1.where条件中对索引列使用函数、运算,如SUBSTR(字段)、字段+1、DATE(字段);2.索引列使用!=、<>、NOTIN、NOTLIKE反向查询;3.模糊查询以%开头,如%张三、%张%;4.字符串字段未加引号,发生隐式类型转换;5.联合索引不遵循最左匹配原则,跳过前置索引列直接查后置列;6.数据库数据量少、查询返回大部分数据,优化器认为全表扫描更快,主动放弃索引;7.事务隔离级别过高、索引统计信息过期。3.什么是死锁?产生条件及解决、预防方案参考答案:死锁是多个事务互相持有对方需要的锁,同时等待对方释放锁,导致所有事务无限阻塞,无法执行完成。死锁四大必要条件:互斥条件、请求保持条件、不可剥夺条件、循环等待条件。四个条件同时满足才会产生死锁。解决方案与预防:1.统一数据库表操作顺序,避免循环等待;2.缩短事务执行时间,减少锁持有时长;3.合理设置锁超时时间,超时自动释放锁;4.避免长事务、大事务,拆分复杂事务;5.数据库开启死锁检测机制,自动终止其中一个事务,打破死锁。4.日常SQL优化的常用手段参考答案:1.索引优化:高频查询字段建立索引,遵循联合索引最左匹配原则,避免索引失效场景,定期维护索引、更新统计信息;2.查询语句优化:避免select*,只查询需要的字段;优先用EXISTS替代IN、用JOIN替代子查询;杜绝冗余关联、重复查询;3.分页优化:大页码分页避免offset偏移量大的查询,采用主键回溯分页;4.事务优化:拆分大事务,减少锁竞争和锁等待时间;5.数据分层:大数据量表分表、分库,冷热数据分离;6.缓存优化:高频查询、低变更数据使用缓存,减少数据库查询压力。五、综合实操面试题(.NET+SQL结合)1.简述项目中遇到的数据库慢查询问题及解决过程参考答案:项目中曾出现列表查询接口响应缓慢,数据量上万后接口超时。首先通过数据库慢查询日志定位问题SQL,执行查看执行计划,发现查询语句未走索引,采用全表扫描,同时存在多表冗余关联、分页偏移量过大问题。解决步骤:第一,对where条件、排序、分页字段建立联合索引,修复索引失效问题;第二,精简SQL语句,删除无用关联表和查询字段,用EXISTS替代IN子查询;第三,优化大页码分页逻辑,改为主键ID回溯分页;第四,对高频查询数据添加缓存,减少重复查库。优化后接口响应速度从数百毫秒降至几十毫秒

温馨提示

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

评论

0/150

提交评论