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

下载本文档

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

文档简介

.NET基础面试题及详细答案(实战版)一、C#基础语法与数据类型1.简述C#中值类型和引用类型的区别,并举出常用类型示例参考答案:值类型和引用类型最核心的区别是内存存储方式和赋值机制不同。值类型数据直接存储在栈内存中,变量本身就是数据值。当变量赋值、参数传递时,会直接拷贝一份全新的数据副本,两个变量相互独立,修改其中一个不会影响另一个。常用值类型:int、double、bool、char、decimal、struct、枚举。引用类型数据的实体存储在堆内存中,栈内存只存储对象的内存地址(引用地址)。变量赋值、参数传递时,只会拷贝内存地址,不会创建新对象,多个变量会指向同一个堆内存对象,修改任意一个变量的值,所有指向该对象的变量都会同步变化。常用引用类型:string、class、数组、集合(List、Dictionary)、自定义类。2.string和StringBuilder的区别?日常开发如何选择?参考答案:string是不可变字符串,一旦初始化,内存中的字符串内容就无法修改。每次对string进行拼接、替换、截取等操作,都会在堆内存中生成一个全新的字符串对象,旧对象会等待垃圾回收。频繁操作字符串会产生大量内存碎片,性能较差。StringBuilder是可变字符串,底层通过字符数组存储数据,支持直接对内存中的字符进行修改、拼接、删除,不会频繁创建新对象,内存占用低、执行效率高。使用场景选择:1.少量字符串操作、固定字符串赋值、单次拼接,直接使用string,代码简洁无多余开销;2.循环内拼接字符串、大量字符串迭代修改、批量文本组装,必须使用StringBuilder,大幅提升性能。3.const和readonly的区别?参考答案:1.赋值时机不同:const是编译时常量,必须在声明时直接赋值,编译后值固定无法修改;readonly是运行时常量,可以在声明时赋值,也可以在类的构造函数中赋值。2.作用域不同:const默认是静态的,不能用static修饰,只能属于类级别,不能在方法内声明;readonly可以是实例级或静态级,可作用于类实例。3.数据类型限制:const只能修饰值类型和string;readonly可以修饰所有数据类型,包括引用类型。4.使用场景:固定不变的全局常量(如配置固定值、状态码)用const;需要在构造函数动态初始化、运行时固定的变量用readonly。4.简述装箱和拆箱的原理及性能影响参考答案:装箱是将值类型转换为object引用类型的过程,拆箱是将object引用类型转回值类型的过程。装箱原理:栈内存中的值类型数据,会被复制到堆内存中创建一个新的引用对象,栈变量转而指向堆内存地址。拆箱原理:从堆内存的引用对象中,取出原始的值类型数据,重新存入栈内存。性能影响:装箱和拆箱都会产生内存分配、数据拷贝操作,频繁触发会造成内存开销增大、程序运行变慢。日常开发中,尽量避免频繁的值类型与object互转,优先使用泛型集合、泛型方法规避装箱拆箱。二、面向对象编程(OOP)核心1.面向对象的三大特性是什么?分别简单说明参考答案:面向对象三大核心特性:封装、继承、多态。1.封装:将类的属性和方法进行私有化封装,隐藏内部实现细节,只对外暴露安全的访问接口。避免外部随意修改内部数据,保证数据安全性和代码复用性,降低耦合。日常通过private、public、protected访问修饰符实现封装。2.继承:允许一个类(子类/派生类)继承另一个类(父类/基类)的属性和方法,子类可以复用父类代码,同时扩展自身新功能。核心作用是减少代码冗余,实现代码复用,C#仅支持单类继承,支持多接口继承。3.多态:同一行为在不同子类中有不同的实现方式。分为编译时多态(方法重载)和运行时多态(方法重写)。核心作用是提高代码扩展性,新增子类无需修改原有业务代码。2.方法重载和方法重写的区别参考答案:1.定义不同:重载是同一个类中,多个方法名称相同,参数列表不同(参数个数、类型、顺序不同);重写是子类对父类中virtual虚方法的实现逻辑进行重新改写。2.作用时机不同:重载是编译时多态,程序编译时就确定调用哪个方法;重写是运行时多态,程序运行时根据对象实际类型确定调用逻辑。3.修饰符不同:重载无特殊修饰符要求;重写需要父类方法用virtual修饰,子类方法用override修饰。4.返回值:重载对返回值无要求;重写必须和父类方法返回值、参数列表完全一致。3.抽象类和接口的区别?使用场景参考答案:1.成员差异:抽象类可以包含字段、属性、普通方法、抽象方法、构造函数;接口只能包含抽象方法、属性、事件,不能有字段和构造函数。2.继承限制:类只能继承一个抽象类;类可以实现多个接口,解决了单继承的局限性。3.访问修饰符:抽象类成员可以使用各种访问修饰符;接口成员默认是public,不能手动修改。4.实现逻辑:抽象类可以有已实现的方法,也可以有未实现的抽象方法;接口所有成员默认都是未实现的,必须由实现类重写。使用场景:需要统一子类通用属性和通用实现逻辑时用抽象类;需要定义统一行为规范、解耦业务、多规范实现时用接口。三、.NET核心机制与内存1.简述.NET的垃圾回收(GC)机制参考答案:GC是.NET的自动内存管理机制,核心作用是自动回收堆内存中不再被使用的对象,释放内存空间,避免内存泄漏,无需开发者手动申请和释放内存。GC只会回收堆内存中的引用类型对象,栈内存由系统自动管理,不受GC控制。GC采用分代回收机制,将对象分为0代、1代、2代:1.0代:新建的短期对象,回收频率最高,速度最快;2.1代:0代回收后存活的对象,作为缓冲层;3.2代:长期存活的全局对象,回收频率最低,耗时最长。GC触发时机:新对象分配内存不足、手动调用GC.Collect、程序空闲时。回收过程中会暂停主线程,因此频繁GC会造成程序卡顿,开发中应尽量减少无效对象创建。2.什么是内存泄漏?.NET中常见的内存泄漏场景参考答案:内存泄漏是指对象已经完成业务使用,不再被程序需要,但仍然被有效引用,导致GC无法回收该对象,长期堆积造成内存占用持续升高的问题。常见场景:1.静态集合、静态变量持有大量对象引用,静态对象生命周期随程序全程,无法释放;2.事件订阅未取消,订阅者被事件源持有引用,导致对象无法回收;3.文件流、数据库连接、网络请求等资源未手动释放,未使用using语句;4.循环引用导致GC无法识别回收对象。3.using语句的作用和原理参考答案:using语句用于自动释放实现了IDisposable接口的资源对象,主要用于文件操作、数据库连接、网络流、锁资源等非托管资源,避免资源泄漏。原理:编译器编译时,会将using代码块自动转换为try-finally结构。无论代码块正常执行结束还是出现异常,finally块都会强制执行Dispose()方法,手动释放非托管资源,无需开发者手动写释放代码。使用规范:所有操作外部资源、实现IDisposable的对象,都建议用using包裹,保证资源及时释放。四、集合与泛型1.ArrayList和List<T>的区别参考答案:1.类型安全:ArrayList是非泛型集合,存储object类型,添加值类型会触发装箱,取值会触发拆箱,无类型校验,容易出现类型转换异常;List<T>是泛型集合,指定固定存储类型,全程无装箱拆箱,类型安全。2.性能:ArrayList频繁增删查改会产生大量装箱拆箱,性能差;List<T>直接存储指定类型,执行效率高。3.适用场景:ArrayList多用于老旧项目兼容,新项目统一使用List<T>。2.Dictionary和Hashtable的区别参考答案:1.类型安全:Hashtable存储object类型,存在装箱拆箱,类型不安全;Dictionary是泛型集合,类型固定,安全高效。2.线程安全:Hashtable支持简单的线程安全,适合多线程轻度并发场景;Dictionary非线程安全,多线程操作需手动加锁。3.性能:Dictionary无装箱拆箱,读写速度远快于Hashtable。4.空值限制:Hashtable键不能为null,值可以为null;Dictionary同样键不可为null,泛型约束更严格。3.泛型的优势是什么?参考答案:1.类型安全:编译时校验数据类型,避免运行时类型转换异常;2.提升性能:彻底规避值类型的装箱拆箱操作,减少内存开销;3.代码复用:一套泛型方法、泛型类可以适配多种数据类型,无需重复编写相似代码;4.灵活性高:结合约束、继承可以实现通用业务逻辑,适配不同业务场景。五、异常与委托事件1.try-catch-finally各模块作用,finally是否一定执行?参考答案:try:包裹可能出现异常的业务代码,用于捕获运行时异常;catch:捕获try块抛出的指定异常,进行异常处理、日志记录、异常兜底逻辑;finally:无论try块正常执行、还是catch捕获异常,都会执行的代码块,主要用于资源释放、关闭连接、清理缓存等收尾操作。绝大部分场景下finally都会执行,唯一不执行的特殊情况:程序手动退出(Environment.Exit)、进程终止、系统强制关闭。2.委托和事件的区别,为什么开发中优先用事件?参考答案:委托是一种可以存储、传递、调用方法的类型,本质是方法的容器;事件是基于委托封装的一种特殊成员,是委托的安全封装。核心区别:1.访问权限:委托可以在外部直接赋值、清空、调用;事件只能在类内部触发,外部只能订阅和取消订阅,无法直接赋值和触发,安全性更高;2.用途不同:委托多用于方法传参、回调、匿名方法;事件多用于模块解耦、消息通知、状态变更回调。开发优先用事件的原因:事件屏蔽了外部触发和篡改的权限,避免外部代码随意覆盖订阅列表、强行触发方法,保证程序逻辑安全,符合面向对象封装原则。六、ASP.NETCore基础1.简述ASP.NETCore的管道模型参考答案:ASP.NETCore采用中间件管道模型处理HTTP请求,所有客户端请求都会按顺序经过管道中的各个中间件,处理完成后再反向响应客户端。中间件是一系列独立的请求处理组件,每个中间件既可以处理请求、也可以处理响应,同时可以将请求传递给下一个中间件。常用内置中间件:路由、跨域、认证授权、静态文件、异常处理等。开发者可以自定义中间件,实现日志记录、请求拦截、参数校验等通用功能,核心优势是解耦、灵活、可配置。2.GET和POST请求的区别参考答案:1.参数传递:GET参数拼接在URL地址中,公开可见;POST参数放在请求体中,相对隐蔽。2.数据长度:GET受URL长度限制,只能传输少量数据;POST无长度限制,可传输大量数据、文件。3.缓存特性:GET请求会被浏览器缓存,可保存历史记录;POST默认不缓存,无历史记录。4.安全性:GET安全性低,参数容易被窃取、篡改;POST安全性更高,适合传输敏感数据。5.语义规范:GET用于查询、获取数据,无数据修改;POST用于新增、修改、提交数据。3.什么是依赖注入(DI)?作用是什么?参考答案:依

温馨提示

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

评论

0/150

提交评论