- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
.NET开发面试题及参考答案
一、基础核心题(初级/中级)
1.C#中值类型和引用类型的区别?实际开发中怎么避免踩坑?
答案:
值类型(int、struct、bool等)存储在栈上,赋值时拷贝完整数据;引用类型(class、interface、string等)存储在堆上,栈中仅存引用地址,赋值时传递地址。
实际踩坑点:①struct作为方法参数时默认值传递,修改不会影响原对象,需显式加ref/out;②string虽为引用类型但不可变,拼接频繁时改用StringBuilder;③集合类(List、Dictionary)是引用类型,跨方法传递时注意是否需要深拷贝(可通过序列化或手动复制属性实现)。
2.说说C#的委托、事件、Lambda表达式的关系和使用场景
答案:
委托是方法的“类型定义”,本质是函数指针的包装;事件是委托的“安全封装”,限制了外部直接调用,仅允许内部触发;Lambda是匿名方法的简化语法,可直接赋值给委托类型。
使用场景:①委托用于回调(如ListT.ForEach)、解耦模块(如插件架构);②事件用于发布-订阅模式(如按钮点击、状态变更通知);③Lambda常用于简化LINQ查询(list.Where(x=x.Age18))或临时回调,避免定义单独方法。
3..NETCore和.NETFramework的核心差异?项目迁移时要注意什么?
答案:
核心差异:①跨平台性:.NETCore支持Windows/Linux/Mac,.NETFramework仅支持Windows;②架构:.NETCore模块化(可按需引用NuGet包),.NETFramework是单体框架;③部署:.NETCore可自包含部署(无需目标机器装框架),.NETFramework依赖全局安装。
迁移注意点:①移除System.Web等.NETFramework特有命名空间,替换为ASP.NETCore对应的组件(如HttpContext获取方式变更);②配置文件从web.config/app.config迁移到appsettings.json,使用IConfiguration读取;③第三方库需确认是否支持.NETCore,不支持的需替换替代方案。
二、框架应用题(中级/高级)
1.ASP.NETCore的中间件执行流程?如何自定义中间件?
答案:
执行流程:中间件是一串处理HTTP请求的管道,请求从第一个中间件进入,按注册顺序依次执行“请求处理逻辑”,处理完成后按反向顺序执行“响应处理逻辑”(类似栈的“先进后出”)。例如:日志中间件→认证中间件→业务中间件→路由中间件→MVC中间件。
自定义中间件两种方式:
①简易方式(Use委托):
app.Use(async(context,next)=
{
//请求处理(进入时执行)
Console.WriteLine(请求到达自定义中间件);
awaitnext();//调用下一个中间件
//响应处理(返回时执行)
Console.WriteLine(响应离开自定义中间件);
});
②标准方式(实现IMiddleware接口):
创建中间件类→注册到DI容器→通过UseMiddleware使用,适合需要依赖注入或复用的场景。
2.EFCore的延迟加载和贪婪加载区别?怎么避免N+1查询问题?
答案:
延迟加载:默认开启(需实体属性为virtual),查询主实体时不加载关联数据,直到首次访问关联属性时才执行额外SQL查询;
贪婪加载:通过Include(单表关联)/ThenInclude(多级关联)显式指定要加载的关联数据,一次查询完成主表+关联表数据。
N+1问题:查询N条主实体时,先执行1条查询获取主实体,再执行N条查询获取每条主实体的关联数据。
解决方式:①用贪婪加载Include一次性加载关联数据;②关闭延迟加载(在DbContext配置UseLazyLoadingProxies(false)),强制显式加载;③对复杂查询,使用Select投影只查询需要的字段,避免加载完整实体。
3.ASP.NETCore的依赖注入(DI)有哪些生命周期?实际项目中如何选择?
答案:
三种生命周期:
①瞬时(Transient):每次请求服务时都创建新实例,适合无状态、轻量级组件(如工具类);
②作用域(Scoped):同一HTTP请求内创建一个实例,不同请求创建新实例,适合和请求相关的组件(如DbContext
原创力文档


文档评论(0)