NET开发工程师笔试真题(含详细答案)_第1页
NET开发工程师笔试真题(含详细答案)_第2页
NET开发工程师笔试真题(含详细答案)_第3页
NET开发工程师笔试真题(含详细答案)_第4页
NET开发工程师笔试真题(含详细答案)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

.NET开发工程师笔试真题(含详细答案)适用岗位:.NET初级/中级开发工程师考试时长:90分钟满分:100分说明:试题涵盖C#基础、面向对象、ADO.NET、EFCore、ASP.NETCore、常见语法坑、项目实战问题,贴合企业实际面试笔试场景,无偏题怪题。一、单项选择题(每题3分,共30分)1.以下关于C#值类型和引用类型的说法,正确的是()A.string属于值类型B.结构体(struct)是引用类型C.值类型变量存储在栈中,引用类型变量引用地址存储在栈中,实际数据存放在堆中D.所有基本数据类型都是值类型,无例外2.下列关于readonly和const的区别,说法错误的是()A.const是编译时常量,readonly是运行时常量B.const可以在方法内定义,readonly只能定义在类级别C.readonly字段可以在构造函数中赋值,const必须定义时直接赋值D.const默认是static,readonly可以是实例或静态字段3.C#中关于虚方法(virtual)和重写(override),说法正确的是()A.子类重写虚方法可以省略override关键字B.virtual方法可以是静态方法C.子类使用new关键字隐藏父类方法时,不会触发多态D.抽象方法可以使用virtual修饰4.ASP.NETCore中,以下不属于依赖注入生命周期的是()A.TransientB.ScopedC.StaticD.Singleton5.下列关于async/await的说法,错误的是()A.await只能修饰Task、Task<T>、ValueTask类型对象B.方法使用async修饰后,返回值会自动封装为TaskC.async方法执行时一定会开启新线程D.await可以避免异步代码回调地狱问题6.EFCore中,以下哪种查询会触发延迟加载()A.开启LazyLoadingProxies后,直接查询主实体,访问导航属性B.使用Include、ThenInclude关联查询C.使用FromSqlRaw执行原生SQL查询D.关闭延迟加载配置后的实体查询7.C#中List<T>和ArrayList的核心区别,说法正确的是()A.ArrayList是泛型集合,类型安全B.List<T>无需装箱拆箱,性能更高,类型安全C.List<T>可以存储任意类型数据D.ArrayList容量固定,无法动态扩容8.以下HTTP请求方式中,常用于资源删除的是()A.GETB.POSTC.DELETED.PUT9.下列关于lock锁的说法,正确的是()A.lock可以锁定值类型B.lock锁是跨进程有效的C.lock可以解决多线程并发竞争问题,保证代码块原子性D.lock锁定null对象不会报错10.ASP.NETCore中间件的执行顺序特点是()A.注册顺序与执行顺序无关B.先注册后执行,后注册先执行C.按照注册顺序依次进入,逆序退出D.随机执行,无固定顺序二、填空题(每空2分,共20分)1.C#中实现接口的关键字是________,继承类的关键字是________。2.面向对象三大特性:封装、________、________。3.ASP.NETCoreDI中,________每次请求创建一个实例,________全局唯一单例实例。4.C#中异常捕获使用try-catch-finally,________块无论是否发生异常都会执行。5.EFCore中,________用于主动加载关联导航属性,实现预加载,避免多次查询数据库。6..NET中垃圾回收(GC)主要回收________中的无用对象内存。7.Lambda表达式的本质是________的简化写法。三、简答题(每题6分,共30分)1.简述值类型和引用类型的核心区别,并举出3种常见的值类型、3种引用类型。2.简述ASP.NETCore中Scoped、Transient、Singleton三种依赖注入生命周期的区别及适用场景。3.什么是异步编程?async/await的工作原理是什么?为什么异步能提升接口吞吐量?4.简述EFCore延迟加载、贪婪加载、显式加载的区别和使用场景。5.多线程开发中,什么是线程安全?常见的线程安全解决方案有哪些?四、编程题(每题10分,共20分)1.编写C#代码,实现一个通用的单例模式(懒加载、线程安全)。2.基于ASP.NETCore,编写一个简单的异步接口,实现查询用户列表功能(模拟EFCore数据库查询,异步写法)。参考答案及详细解析一、单项选择题答案1.答案:C解析:A选项string是特殊的引用类型;B选项struct是值类型;D选项string、object是引用类型,并非所有基础类型都是值类型。值类型存栈,引用类型栈存地址、堆存数据是核心特性。2.答案:B解析:const可以在类、方法内定义;readonly只能在类级别定义,不能在方法内使用。其余选项均为二者正确区别。3.答案:C解析:A选项重写虚方法必须加override;B选项virtual只能修饰实例方法,静态方法不支持多态;D选项抽象方法默认隐式virtual,不能手动修饰。new隐藏方法属于静态绑定,无多态效果。4.答案:C解析:ASP.NETCoreDI三大生命周期为Transient(瞬时)、Scoped(作用域)、Singleton(单例),无Static类型。5.答案:C解析:async/await是基于线程池复用的异步模型,并非每次执行都开启新线程,大部分IO异步操作无新线程创建,只是释放当前线程等待任务完成。6.答案:A解析:EFCore延迟加载需要开启代理延迟加载配置,访问未预加载的导航属性时,会自动触发二次数据库查询。B是贪婪加载,C、D无延迟加载效果。7.答案:B解析:ArrayList是非泛型集合,存储数据会发生装箱拆箱,无类型安全;List<T>是泛型集合,类型约束严格,无需装箱拆箱,性能更优,且支持动态扩容。8.答案:C解析:RESTful规范中,GET查询、POST新增、PUT修改、DELETE删除资源。9.答案:C解析:lock只能锁定引用类型,不能锁值类型;lock是进程内锁,跨进程无效;锁定null对象会直接抛出异常。lock可保证同一时刻只有一个线程执行锁定代码,解决并发竞争。10.答案:C解析:ASP.NETCore中间件遵循「洋葱模型」,按注册顺序依次进入管道,执行完业务逻辑后逆序退出。二、填空题答案1.implements(隐式/显式实现)、:2.继承、多态3.Scoped、Singleton4.finally5.Include/ThenInclude6.堆(Heap)7.匿名方法三、简答题详细答案1.值类型与引用类型核心区别+举例核心区别:①存储位置:值类型数据直接存储在栈中;引用类型栈中存储内存地址,真实数据存储在堆中。②赋值方式:值类型赋值是值拷贝,新旧变量相互独立;引用类型赋值是地址拷贝,多个变量指向同一堆内存数据,修改会相互影响。③内存回收:值类型随栈帧销毁自动释放;引用类型由GC统一回收堆内存。举例:值类型:int、double、bool、struct、enum引用类型:string、class、数组、List<T>、自定义实体类2.DI三种生命周期区别及适用场景①Transient(瞬时):每次获取依赖都会创建一个全新实例,生命周期最短。适用于轻量、无状态、频繁创建的服务,如通用工具类。②Scoped(作用域):同一个HTTP请求内共享一个实例,不同请求实例不同。适用于业务逻辑服务、数据库上下文(DbContext),是项目最常用生命周期。③Singleton(单例):程序启动后全局唯一实例,全程复用。适用于全局配置、缓存服务、日志服务等全局通用、无请求隔离需求的服务。3.异步编程及async/await原理、吞吐量优势异步编程是一种非阻塞编程模式,无需等待耗时操作(数据库查询、网络请求、文件读写)完成,即可释放当前线程处理其他任务,避免线程阻塞等待。工作原理:async标记方法为异步方法,返回Task任务对象;await用于暂停当前异步方法执行,释放调用线程,等待耗时IO任务完成后,再从线程池取回线程继续执行后续代码。吞吐量提升原因:同步接口中,耗时IO会阻塞线程,线程一直占用无法处理新请求,导致系统吞吐量低;异步模式下,IO等待期间线程被释放复用,可同时处理更多请求,充分利用线程池资源,大幅提升接口并发吞吐量。4.EFCore三种加载方式区别及场景①贪婪加载(Include/ThenInclude):查询主实体时,一次性联查所有指定导航属性数据,单次SQL查询完成。适用于明确需要使用关联数据的场景,避免多次查库。②延迟加载:查询主实体时只查主表数据,访问导航属性时自动二次查库加载关联数据。适用于不确定是否需要关联数据、按需使用的场景,需开启延迟加载配置。③显式加载:查询主实体后,手动调用Load()方法加载关联数据,可控性最高。适用于部分场景动态判断是否需要加载关联数据的业务。5.线程安全及解决方案线程安全:多线程同时操作共享资源(全局变量、静态变量、集合、数据库数据)时,不会出现数据错乱、数据覆盖、逻辑异常的特性。多线程并发读写共享资源时,极易出现非线程安全问题。常见解决方案:①使用lock锁锁定共享代码块,保证原子性;②使用线程安全集合(ConcurrentList、ConcurrentDictionary)替代普通集合;③使用Interlocked原子操作处理简单数值增减;④采用读写锁ReaderWriterLockSlim,区分读写并发场景;⑤尽量减少共享变量,使用局部变量实现线程隔离。四、编程题详细答案1.线程安全懒加载单例模式csharp

///<summary>

///线程安全懒加载单例模式(推荐写法,性能最优)

///</summary>

publicclassSingletonDemo

{

//私有静态只读延迟初始化对象

privatestaticreadonlyLazy<SingletonDemo>_instance=newLazy<SingletonDemo>(()=>newSingletonDemo());

//私有构造函数,禁止外部实例化

privateSingletonDemo()

{

}

//公开全局访问入口

publicstaticSingletonDemoInstance=>_instance.Value;

//测试方法

publicvoidTestMethod()

{

Console.WriteLine("单例模式调用成功");

}

}

说明:基于Lazy实现,.NET原生线程安全,懒加载(使用时才实例化),无需手动写双重校验锁,简洁且性能最优,是企业项目主流写法。2.ASP.NETCore异步查询用户接口csharp

//1.定义用户实体

publicclassUser

{

publicintId{get;set;}

publicstringUserName{get;set;}=string.Empty;

publicstringPhone{get;set;}=string.Empty;

publicDateTimeCreateTime{get;set;}

}

//2.自定义数据库上下文(模拟EFCore)

publicclassAppDbContext:DbContext

{

publicDbSet<User>Users{get;set;}

protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder)

{

//模拟数据库连接,实际项目读取配置文件

optionsBuilder.UseSqlServer("Server=.;Database=TestDb;Trusted_Connection=True;");

}

}

//3.控制器接口

[ApiController]

[Route("api/[controller]")]

publicclassUserController:ControllerBase

{

///<summary>

///异步查询所有用户列表

///</summary>

///<returns></returns>

[HttpGet("list")]

publicasyncTask<IActionResult>GetUserList()

{

//使用using释放数据库连接

温馨提示

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

评论

0/150

提交评论