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

下载本文档

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

文档简介

C#.NET高频面试题及详细答案(实战向)一、C#基础语法面试题1、值类型和引用类型的区别?日常开发常用类型有哪些?参考答案:核心区别在于内存存储方式、赋值逻辑和生命周期,是C#最基础也最常问的知识点:1)值类型:数据直接存储在栈内存中,赋值时会完整拷贝一份数据副本,两个变量相互独立,修改一个不会影响另一个。值类型在声明时就会分配内存,无需手动释放,系统自动回收。常用值类型:int、double、bool、char、decimal、struct、枚举2)引用类型:数据本体存储在堆内存,栈内存仅存储堆内存的地址(引用指针)。赋值时仅拷贝地址,不会拷贝数据本身,多个变量指向同一块堆内存,修改任意一个变量的值,所有指向该地址的变量都会同步变化。常用引用类型:string、数组、class、接口、委托、集合(List、Dictionary等)实战补充:string是特殊的引用类型,具备不可变性,每次赋值修改都会生成新对象,不会改动原内存数据。2、string、StringBuilder、StringBuffer的区别及使用场景?参考答案:C#中只有string和StringBuilder,StringBuffer是Java类,很多面试官会混淆提问,重点区分前两者:1)string:字符串不可变,每次拼接、修改字符串都会新建一个字符串对象,频繁操作会产生大量垃圾对象,占用堆内存,性能较差。适用场景:字符串固定不变、少量拼接的场景,比如常量定义、单次字符串赋值。2)StringBuilder:可变字符串,底层是字符数组,修改、拼接时不会新建对象,直接在原有内存中操作,频繁字符串操作性能大幅提升。适用场景:循环拼接、大量字符串修改场景,比如批量拼接日志、组装SQL语句、导出文本内容。实战技巧:默认容量16,预估字符串长度时可手动初始化容量,减少扩容次数,进一步优化性能。3、const和readonly的区别?参考答案:两者都用于定义常量,核心区别在初始化时机、访问方式、使用范围:1)const:编译时常量,编译时就确定值,必须在声明时直接赋值,不能延迟赋值。默认是静态的,不能用static修饰,只能访问静态常量,不能修饰对象字段。适用:固定不变的全局常量,比如接口地址、状态码、固定配置值。2)readonly:运行时常量,可在声明时赋值,也可在类的构造函数中赋值,对象实例化后值无法修改。属于实例字段,需要实例对象访问,也可配合static使用。适用:需要根据实例动态初始化、运行时确定的固定值,比如用户ID、创建时间。4、ref和out关键字的区别?参考答案:两者都是通过地址传参,实现方法内修改实参值,替代返回多个值的场景,区别如下:1)ref:传入的参数必须提前初始化赋值,方法内可以读取、修改参数值,方法外参数值会同步更新。适用于需要修改原有变量值的场景。2)out:传入的参数无需提前初始化,但方法内必须强制赋值,否则编译报错。专门用于方法输出多个返回值。实战场景:int.TryParse就是典型的out用法,输出转换后的数值。5、装箱和拆箱是什么?有什么性能问题?参考答案:装箱:将值类型转换为object引用类型,本质是把栈内存的数据拷贝到堆内存,生成新引用对象。拆箱:将object引用类型转回值类型,需要强制类型转换,从堆内存读取数据拷贝到栈内存。性能问题:装箱拆箱会产生堆内存分配、数据拷贝、垃圾回收压力,频繁操作会严重影响程序性能。优化方案:尽量使用泛型集合(List<T>)替代非泛型集合(ArrayList),避免自动装箱拆箱。二、C#进阶核心面试题1、面向对象的三大特性及实际项目应用?参考答案:面向对象三大特性:封装、继承、多态,是.NET项目架构设计的基础:1)封装:隐藏类的内部私有字段和实现细节,仅通过公开方法、属性对外提供访问接口。避免外部随意修改核心数据,保证数据安全,降低代码耦合度。项目应用:实体类字段私有,通过get/set属性控制赋值、取值逻辑;业务层封装核心算法,对外只暴露调用方法。2)继承:子类复用父类的属性和方法,避免重复代码,提升代码复用性,统一代码规范。项目应用:定义BaseController、BaseService基类,封装通用分页、异常处理、日志记录、参数校验逻辑,所有子类直接继承使用。3)多态:同一方法,不同子类实现不同逻辑,分为重写(override)和重载(overload)。项目应用:支付接口IPay,子类实现微信支付、支付宝支付、银行卡支付,统一调用Pay方法,不同支付方式执行不同逻辑,拓展新支付方式无需改动原有代码。2、override和overload的区别?参考答案:1)重载(overload):同一类中,方法名相同,参数个数、类型、顺序不同,和返回值无关。编译时多态,用于扩展同一功能的不同参数场景。示例:Add(inta,intb)、Add(doublea,doubleb)2)重写(override):存在于父子类之间,子类重写父类的虚方法(virtual、abstract),方法名、参数、返回值完全一致。运行时多态,用于改写父类原有逻辑。3、抽象类(abstract)和接口(interface)的区别?参考答案:1)成员区别:抽象类可以有字段、属性、普通方法、抽象方法、构造函数;接口只能有抽象方法、属性、事件,不能有字段和构造函数。2)继承区别:类只能单继承一个抽象类,但可以多实现多个接口,解决单继承局限。3)实现区别:抽象类子类可选择性重写普通方法,必须重写抽象方法;接口所有成员必须全部实现。4)访问修饰符:抽象类成员可使用public、protected等修饰;接口成员默认public,不能手动修改。实战选型:既有通用代码又有规范定义用抽象类;只做行为规范、多协议约束用接口。4、委托、事件的区别和使用场景?参考答案:委托是方法的容器,是一种引用类型,用于存储、传递方法地址,实现方法的动态调用;事件是委托的封装,是委托的特殊实例。核心区别:1)权限不同:委托可以在外部直接赋值(=)、调用,存在覆盖风险;事件只能在类内部触发,外部只能订阅(+=)、取消订阅(-=),更安全。2)用途不同:委托多用于回调方法、匿名方法、Lambda表达式;事件多用于消息通知、解耦业务逻辑。项目场景:系统日志通知、订单状态变更推送、界面刷新回调,都用事件实现解耦。5、GC垃圾回收机制原理?如何手动优化GC?参考答案:C#托管代码由CLR的GC自动回收堆内存无用对象,栈内存自动释放,无需手动管理。GC核心原理:通过标记、清除、压缩三个步骤回收垃圾,分三代回收机制(0代、1代、2代),新对象存0代,频繁回收;老旧对象升代,回收频率低,提升回收效率。内存泄漏常见原因:静态变量持有对象、事件未取消订阅、大对象未释放、文件/数据库流未关闭。优化方案:1)非托管资源(文件流、数据库连接、网络请求)手动using释放,实现IDisposable接口;2)避免滥用静态集合存储大量数据;3)用完事件及时-=取消订阅;4)大对象拆分处理,减少大堆内存分配。三、.NET框架与Web核心面试题1、ASP.NETCore相比传统ASP.NETMVC有哪些优势?参考答案:1)跨平台:Core支持Windows、Linux、Mac部署,传统MVC仅支持Windows;2)轻量高性能:移除冗余组件,内置依赖注入、中间件,启动更快、吞吐量更高;3)部署灵活:可独立部署、托管部署,无需安装完整IIS,可跨容器部署(Docker);4)模块化开发:中间件管道模式,按需引入功能组件,灵活配置请求流程;5)统一框架:Core整合了MVC和WebApi,不再区分控制器类型,一套框架实现前后端交互。2、ASP.NETCore中间件的执行原理?常用中间件有哪些?参考答案:中间件是处理HTTP请求的管道组件,所有请求按注册顺序依次执行,遵循先注册后执行、后进先出的洋葱模型。请求进入时从上到下执行中间件逻辑,响应返回时从下到上回溯执行。常用内置中间件:1)静态文件中间件:处理css、js、图片等静态资源;2)路由中间件:匹配请求路由地址;3)身份认证授权中间件:处理登录认证、接口权限校验;4)异常处理中间件:全局捕获系统异常,统一返回错误信息。3、依赖注入(DI)的生命周期及区别?参考答案:ASP.NETCore内置三种依赖注入生命周期,是项目开发最常用的基础配置:1)Transient(瞬时):每次请求获取实例都会新建对象,生命周期最短,适合轻量无状态服务,默认注册方式;2)Scoped(作用域):同一个HTTP请求内共享一个实例,不同请求生成新实例,最常用,适合业务服务层、仓储层;3)Singleton(单例):程序启动后全局唯一实例,程序销毁才释放,适合全局配置、工具类、缓存服务,注意线程安全问题。4、MVC和MVVM模式的区别?参考答案:1)MVC:后端开发模式,Model(数据模型)、View(视图)、Controller(控制器),控制器承接请求、处理业务、返回视图,View和Model不直接交互,适合Web后端项目;2)MVVM:前端/WPF开发模式,Model、View、ViewModel,ViewModel双向绑定视图和数据,无需手动操作DOM,视图和业务逻辑完全解耦,适合Vue、WPF、Blazor项目。四、数据库与EFCore面试题1、EFCore延迟加载和立即加载的区别?如何开启?参考答案:1)立即加载(Include):查询主表数据时,通过Include、ThenInclude一次性查询出关联的从表数据,单次数据库查询,适合明确需要关联数据的场景,避免多次查库;2)延迟加载:默认关闭,访问关联属性时才会触发二次查库,按需加载数据。需要安装Microsoft.EntityFrameworkCore.Proxies包,配置UseLazyLoadingProxies开启。实战问题:延迟加载容易产生N+1查询问题,批量查询场景优先用立即加载,提升性能。2、数据库索引的作用、优缺点?哪些字段适合建索引?参考答案:索引本质是数据库的目录结构,用于提升查询效率,减少全表扫描。优点:大幅提升查询、排序、分组效率;缺点:占用磁盘空间,新增、修改、删除数据时需要维护索引,降低写入性能。适合建索引字段:高频查询、筛选、排序、分组的字段(手机号、订单号、用户ID);不适合:数据量小、频繁修改、重复率极高的字段(性别、状态)。3、SQL优化的常用方案?参考答案:1)避免select*,只查询需要的字段,减少数据传输;2)合理建立索引,避免索引失效(like%前缀、or、null判断、字段隐式转换);3)避免全表扫描,大表查询必须加条件分页;4)尽量使用in、join替代子查询,减少嵌套查询;5)批量操作使用批量新增、更新,替代循环单条操作;6)开启数据库读写分离,分担主库压力。五、项目实战与高频场景面试题1、如何解决接口跨域问题?参考答案:浏览器同源策略导致前端调用后端接口跨域,.NETCore常用三种解决方案:1)项目配置CORS跨域中间件,允许指定域名、请求方法、请求头跨域,生产环境最常用、最安全;2)接口添加[EnableCors]特性,针对单个控制器/接口开启跨域;3)网关层配置跨域,统一处理所有接口跨域问题,适合微服务项目。2、接口幂等性如何实现?参考答案:幂等性指多次请求接口,最终数据结果一致,避免重复提交、重复下单、重复扣款问题,项目常用实现方式:1)唯一索引:数据库字段设置唯一索引,重复数据自动拦截;2)Token令牌:前端请求前获取唯一Token,提交时携带Token,后端校验并删除Token,二次请求失效;3)分布式锁:Redis锁控制同一业务同一时间只能执行一次;4)状态机控制:通过订单状态、支付状态判断,已处理数据直接返回成功,不重复执行逻辑。3、如何处理高并发场景?参考答案:1)缓存优化:引入Redis缓存热点数据,减少数据库查询压力;2)异步处理:通过RabbitMQ、Kafka消息队列将同步操作转为异步,削峰填谷;3

温馨提示

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

评论

0/150

提交评论