中级.NET开发工程师面试经历

文章目录

  • 前言
  • 面试题目(只记录了还记得的部分)
    • 一.简单说下.NETCORE的生命周期?
    • 二.C#如何保证在并发情况下接口不会被重复触发?
    • 三.引用类型和值类型有什么区别?
    • 四.那怎样能让引用类型和值类型一样,在赋值的时候创建新的数据?(在更改新的引用类型对象b的时候,不影响原来的引用类型对象a)
    • 五.C#获取接口响应时间。
    • 六.需要所有接口都这样写一次吗?可以统一获取接口响应时间吗?
    • 七.接口的异常捕捉。
    • 八..NETCORE注册如何注册并使用Session?
    • 九.数据库如何实现事务隔离?
    • 十.聚集索引和非聚集索引。
  • 总结

前言

公司近期工作制度不合理,跟管理层反映无果后,就有了跳槽的打算,于是开始寻找新的机会,参加了一家中级.NET开发工程师的面试。

面试题目(只记录了还记得的部分)

一.简单说下.NETCORE的生命周期?

1.文言一心版回答:
.NET Core应用程序的生命周期通常从创建应用程序的主入口点开始,随后是初始化应用程序,配置服务,建立请求管道,以处理每个HTTP请求。在请求处理完毕后,应用程序会关闭。

2.ChatAI3.5版回答:
在.NET Core 应用程序中,有以下几个主要的生命周期阶段:
a.启动阶段(Bootstrap):在这个阶段,应用程序会进行一些初始化操作,比如加载配置,注册服务,设置日志等。
b.运行时阶段(Runtime):在这个阶段,应用程序正式开始执行业务逻辑,处理请求等操作。
c.关闭阶段(Shutdown):在应用程序即将停止运行时,会执行一些清理操作,释放资源等。
在这些阶段中,可以通过事件来监听应用程序的状态变化,以便在合适的时机执行相应的操作。比如可以使用以下事件:
ApplicationStarted:应用程序启动时触发。
ApplicationStopping:应用程序即将停止时触发。
ApplicationStopped:应用程序已经停止时触发。
通过监听这些事件,可以在不同阶段执行相应的代码,以实现更精细的控制和管理应用程序的生命周期。

3.博客园某博主的相关回答:
.NetCore 依赖注入的三个生命周期理解:
AddTransient瞬时模式:每次请求,都获取一个新的实例。即使同一个请求获取多次也会是不同的实例(注意这里的获取多次对象是指通过上下文获取对象,而不是共用上一个对象)
AddScoped:每次请求都获取一个新的实例。同一个请求获取多次会得到相同的实例。
AddSingleton单例模式:每次都获取同一个实例。

二.C#如何保证在并发情况下接口不会被重复触发?

1.接口在都是同步代码的情况下,我会使用lock语句块对代码进行加锁。

2.接口在存在异步代码的情况下,我会使用Semaphore或者SemaphoreSlim,通过信息量控制接口线程保证接口不会被重复触发。

3.通过redis锁的方式,保证单据的唯一性。

4.通过数据库锁的方式,使用WITH(TABLOCK,HOLDLOCK)选项来获取表级别的排它锁,或者使用WITH(UPDLOCKL,ROWLOCK)选项来获取行级别的排它锁,从而控制对数据库对象的并发访问。

三.引用类型和值类型有什么区别?

1.引用类型:
a.变量存储对象的引用(内存地址),实际数据存储在堆上。
b.引用类型的变量指向实际的对象,对变量赋值只复制引用,不复制整个对象(比如说a对象赋值给b对象,当我们对b对象进行更改的时候,a对象也会跟着改变,因为他们实际上是指向同一个内存地址,值从始至终都只有一个)
c.常用的引用类型有:类(Class),接口(Interface),委托(Delegate),字符串(string),数组(Array)等

2.值类型:
a.变量直接包含数据,存储在栈中
b.值类型赋值会直接复制一个新的数据(比如说a赋值给b,就会在b那复制一份新的数据,对b进行任何操作都不影响a)
c.常用的值类型有:整数类型(int,long,short,byte),浮点数类型(float,double,decimal),字符类型(char),布尔类型(bool),结构体(struct),枚举(enum),int?,DateTime?(问号表示值可以为null)等

四.那怎样能让引用类型和值类型一样,在赋值的时候创建新的数据?(在更改新的引用类型对象b的时候,不影响原来的引用类型对象a)

ChatAI3.5回答:
1.深拷贝(Deep Copy):对于自定义的引用类型,可以在对象内部实现深拷贝逻辑;即创建一个新的对象,将原始对象的数据赋值到新对象中。这样,在对新的对象进行修改时不会影响初始对象。

2.使用特定的复制方法:对于一些标准的引用类型,比如说字符串和数组,就可以使用string.Copy()和Array.Copy()方法来创建新的对象。

个人补充:
1.C#在方法调用参数的时候,参数类型前面可以加ref或者in关键字;
其中ref关键字会让任何传递过来的参数当作引用类型处理(即在方法中变更参数,传入方法中的值参数也会被当作引用类型处理,同步发生改变)
而in关键,会将传递过来的参数视为只读,这样就避免了在方法内部对参数进行修改。

2.C#可以通过序列化,反序列化生成一个新的引用类型,不影响初始引用对象。

五.C#获取接口响应时间。

ChatAI3.5回答:
1.使用Stopwatch对象,使用stopwatch.Start()方法和stopwatch.Stop()方法分别置于接口请求前后,而后通过stopwatch.Elapsed属性获取接口响应时间。

2.接口请求前后分别使用DateTimeOffset.UtcNow.ToUnixTimeSeconds()获取当前服务器的时间戳值,通过两个时间戳的差值得到接口响应时间。

六.需要所有接口都这样写一次吗?可以统一获取接口响应时间吗?

ChatAI3.5回答:
1.在C#中,可以通过创建一个统一的HTTP客户端类来封装发送HTTP请求的逻辑,并在其中实现统一计算接口请求消耗时间的功能。这样可以避免每个接口单独计算请求消耗时间的重复操作。
代码案例如下:

using System;
using System.Diagnostics;
using System.Net.Http;
using System.Threading.Tasks;public class CustomHttpClient
{private HttpClient _httpClient;public CustomHttpClient(){_httpClient = new HttpClient();}public async Task<string> GetResponseTimeAsync(string url){var stopwatch = new Stopwatch();stopwatch.Start()HttpResponseMessage response = await _httpClient.GetAsync(url);stopwatch.Stop();TimeSpan elapsed = stopwatch.Elapsed;return $"接口响应时间为:{elapsed.TotalMilliseconds}ms";}
}

七.接口的异常捕捉。

ChatAI3.5回答:
在C#中,你可以通过自定义Action Filter来实现用户请求接口异常时记录异常信息,请求参数等功能。Action Filter是ASP.NET Core中一种常用的过滤器,可以用来在执行控制器中的Action前后执行一些逻辑,列入日志记录,异常处理等操作。

下面是一种简单的示例,演示了如何在ASP.NET Core 中实现一个自定义Action Filter来记录异常信息和请求参数:

首先,定义一个自定的Action Filter类,继承IActionFilter接口:

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;public class CustomActionFilter : IActionFilter{private readonly ILogger<CustomActionFilter> _logger;public CustomActionFilter(ILogger<CustomActionFilter> logger){_logger = logger;}public void OnActionExecting(ActionExecutingContext context){//在执行Action前记录请求参数var parameters = context.ActionArguments;_logger.LogInformation("Request Parameters:{@parmeters}",parameters);}public void OnActionExecuted(ActionExecutedContext context){//在执行Action后记录异常信息if(context.Exception != null){_logger.logError(context.Exception,"An error occurred while processing the request.");}}
}

然后,在Starup.cs中注册该Aciton Filter;

using Microsoft.Extensions.DependencyInjection;public class Startup{public void ConfigureServices(IServericeCollection services){services.AddControllers(options => {option.Filters.Add<CustomActionFilter>();});//添加其他服务配置}
}

在上述案例中,我们定义了一个 CustomActionFilter类来实现自定一个的Action Filter功能,其中在OnActionExecuting方法中记录请求参数,在OnActionExecuted方法中记录异常信息。然后在Startup.cs中通过options.Filters.Add()注册该Action Filter。

通过这种方式,当用户请求接口发生异常,Action Filter会自动捕捉并记录异常信息,请求参数等,方便后续排查问题和分析。

八…NETCORE注册如何注册并使用Session?

ChatAI3.5回答:
在Asp.NET Core中,你可以通过AddSession方法来注册并配置Session功能。下面是一个简单的示例。

首先,在Startup.cs的ConfigureServices方法中进行注册和配置:

public class Startup{public void ConfigureServices(IServiceCollection services){//其他服务配置services.AddSession(options=>{options.IdleTImeout = TimeSpan.FromMinutes(20);options.Cookie.HttpOnly = true;options.Cooie.IsEssential = true;});//其他服务配置}public void Configure(IApplicationBuilder app,IWebHostEnvironment env){//其他中间件配置app.UseSession();//其他中间件配置}
}

在上述案例中,我们功过services.AddSession()方法注册了Session功能,并且配置了Session的超时时间,Cookie特性等。然后在Configure方法中使用app.UseSession()启用了Session中间件。
接下来,可以在控制器或者Razor页面中使用HttpContext.Session属性来访问和操作Session数据,例如:

public	class HomeController:Controller{public IActionResult Index(){HttpContext.Session.SetString("UserName","Joker");var userName = HttpContext.Session.GetString("UserName");return View();}
}

上述案例中,通过HttpContext.Session.SetString()方法存储Session值,HttpContext.Session.GetString()方法获取对应的Session值

九.数据库如何实现事务隔离?

数据库可以通过加锁来实现事务隔离,常见的锁有行级锁,表级锁,页级锁等。这些锁可以用于实现不同的事务隔离级别,例如可重复读和串行化级别。比如:

1.行级锁:行级锁是对数据库中的行进行加锁,当一个事务要访问某一行数据时,会获取该行的锁,其他事务无法修改该行知道锁被释放。行及锁可以实现较高的并发性和灵活性;sqlserver常见的行级锁有:共享锁(Shared Lock),排他锁(Exclusive Lock)

2.表级锁:表级锁时对整个表进行加锁,当一个事务要访问表中的数据时,会获取整个表的锁,其他事务无法修改表中的数据知道锁被释放。表级锁通常用于较低级别的隔离要求,因为它限制了其他事务对表的访问;sqlserver常见的表级锁有:表共享锁(table shared lock),表排它锁(table exclusive lock)

3.页级锁:页级锁时对数据库中的页(通常是连续的数据块)进行加锁,当一个事务需要访问某一页数据时,会获取该页的锁,其他事务无法修改该页中的数据知道锁被释放。页级锁介于行级锁和表级锁之间,可以在一定程度上平衡并发性能和隔离级别要求;sqlserver常见的页级锁有:页共享锁(page shared lock),页排它锁(page exclusive lock)

4.sqlserver还提供了其他类型的锁,比如 意向锁(intent lock),更新锁(update lock),行版本锁(row versioning locks)等,用于支持不同的并发控制需求

十.聚集索引和非聚集索引。

sqlserver中的聚集索引和非聚集索引是数据库中常用的两种索引类型,他们在数据库查询性能优化和数据存储方面起到重要作用。
1.聚集索引(Clustered Index):
a. 定义:聚集索引确定了表中数据的物理排序顺序,并且叶子节点包含实际的数据行。
b.特点:每张表只有一个聚集索引,它决定了表中数据的物理存储顺序,因此表中的数据按照聚集索引的顺序进行存储。
c.优势:通过聚集索引可以快速查询范围内的数据,因为数据行在物理上相邻,适合范围查询和排序。
d.适用场景:适用于经常按照某列进行范围查找和排序的字段。

2.非聚集索引(Non-Clustered Index):
a.定义:非聚集索引中叶子节点并不包含实际的数据行,而是包含指向实际数据行的指针。
b.特点:一张表可以拥有多个非聚集索引,他们并不影响表中数据的物理存储顺序,而是在索引中维护指向实际数据行的引用。
c.优势:通过非聚集索引可以快速定位到需要的记录,适合于单值查询和覆盖索引。
d.适用场景:适合于经常要进行单值查询的字段,例如where子句中的条件字段。

总结

总的来说,这是一场很失败的面试经历,吃一堑长一智,再接再厉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Latex】TeXstudio编译器选项修改

1、动机 编译国科大博士毕业答辩论文latex时报错 Package ctable Error: You must load ctable after tikz. 2、方法 经过搜索发现是因为这是中文模板&#xff0c;编译的选项不对&#xff0c;需要从 PDFLaTeX 调整到 XeLaTeX。于是操作如下 1&#xff09;点击选项 2&#xf…

linux 文件目录操作命令【重点】

目录 ls cd cat more tail【工作中使用多】 mkdir rmdir rm ls 作用: 显示指定目录下的内容 语法: ls [-al] [dir] 说明: -a 显示所有文件及目录 (. 开头的隐藏文件也会列出) -l 除文件名称外&#xff0c;同时将文件型态(d表示目录&#xff0c;-表示文件)、权限…

SpringMVC POST请求传参 属性名字母大写注入失败解决方案

问题描述&#xff1a; 我现在有一个接口通过一个实体(RequestBody)去接收一系列的参数&#xff0c;前端传参为一个JSON字符串&#xff0c;但是当我的属性名以大写字母开头(有的中间还有下划线)&#xff0c;或者第二个字母是大写字母的时候&#xff0c;我发现后端接收不到参数值…

Flask——基于python完整实现客户端和服务器后端流式请求及响应

文章目录 本地客户端Flask服务器后端客户端/服务器端流式接收[打字机]效果 看了很多相关博客&#xff0c;但是都没有本地客户端和服务器后端的完整代码示例&#xff0c;有的也只说了如何流式获取后端结果&#xff0c;基本没有讲两端如何同时实现流式输入输出&#xff0c;特此整…

C++字符串类

C中有两种主要的字符串类&#xff1a;std::string 和 std::wstring。 std::string std::string 是 C 标准库中用于处理 ASCII 字符串的类。它提供了丰富的方法来操作字符串&#xff0c;包括插入、删除、查找子串、比较等功能。使用 std::string 需要包含头文件 <string>…

8.CSS层叠继承规则总结

CSS 层叠继承规则总结 经典真题 请简述一下 CSS 中的层叠规则 CSS 中的层叠继承规则 在前面《CSS属性的计算过程》中&#xff0c;我们介绍了每一个元素都有都有所有的属性&#xff0c;每一个属性都会通过一系列的计算过程得到最终的值。 这里来回顾一下计算过程&#xff0…

Node.js中如何处理异步编程

在Node.js中&#xff0c;处理异步编程是至关重要的技能。由于Node.js的单线程执行模型&#xff0c;异步编程可以极大地提高程序的性能和响应速度。本文将介绍几种常见的异步编程处理方式&#xff0c;并附上示例代码&#xff0c;帮助您更好地理解和应用异步编程技术。 回调函数…

家政小程序开发,引领家庭服务新时代的科技革命

随着科技的飞速发展&#xff0c;人们的生活方式正在发生深刻的变化。其中&#xff0c;家政服务作为日常生活的重要组成部分&#xff0c;也在经历着一场由小程序技术引领的科技革命。本文将探讨家政小程序的发展趋势、功能特点以及对家庭服务的深远影响。 一、家政小程序的发展…

Linux命令-chattr命令(用来改变文件属性)

说明 chattr命令 用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性&#xff0c;这些属 性共有以下8种模式。 语法 chattr(选项)选项 a&#xff1a;让文件或目录仅供附加用途&#xff1b; b&#xff1a;不更新文件或目录的最后存取时间&#xff1b; c…

NFTScan Labs,一个聚焦在 NFT 领域的开发者组织

NFTScan Labs 是一个聚焦在 NFT 领域的开发者组织&#xff0c;成立于 2021 年 3 月份。NFTScan Labs 核心成员从 2016 年开始涉足区块链领域&#xff0c;有多年开发经验和前沿行业认知&#xff0c;对加密钱包、区块链安全、链上数据追踪、DeFi、预言机、NFT 等领域有深入的研究…

2/22作业

1.按位置插入 void insert_pos(seq_p L,datetype value,int pos) { if(LNULL) { printf("入参为空\n"); return; } if(seq_full(L)) { printf("表已满\n"); return; } if(pos>L->len|…

Jenkins的使用GIT(4)

Jenkins的使用GIT 20211002 我们使用 Jenkins 集成外部 Git 仓库&#xff0c;实现对真实代码的拉取和构建。在这里&#xff0c;我们选用 Coding/Github/Gitee 等都可以作为我们的代码源 1 生成公钥私钥 首先&#xff0c;我们先来配置公钥和私钥。这是 Jenkins 访问 Git 私有库…

【nvm】下载安装及使用(包含windows和Linux)

目录 1、Windows版本下载及安装 2、Linux下载及安装 下载 安装 3、使用 在不借助第三方工具的情况下切换node版本&#xff0c;只能卸载现有版本&#xff0c;安装需要的版本&#xff0c;这样显然很麻烦。而nvm就很好的帮我们解决了这个问题。 nvm&#xff08;node.js vers…

QT中调用python

一.概述 1.Python功能强大&#xff0c;很多Qt或者c/c开发不方便的功能可以由Python编码开发&#xff0c;尤其是一些算法库的应用上&#xff0c;然后Qt调用Python。 2.在Qt调用Python的过程中&#xff0c;必须要安装python环境&#xff0c;并且Qt Creator中编译器与Python的版…

OpenCV:计算机视觉领域的瑞士军刀

摘要 本文将深入探索OpenCV&#xff08;开源计算机视觉库&#xff09;的基本概念、应用领域、主要功能和未来发展。通过本文&#xff0c;读者将能够理解OpenCV在计算机视觉中的重要性&#xff0c;并掌握其基本使用方法。 一、引言 随着人工智能和机器学习技术的飞速发展&…

IDEA启动Springboot报错:无效的目标发行版:17 的解决办法

无效的目标发行版&#xff1a;17 的解决办法 一般有两个原因&#xff0c;一可能是本地没有安装JDK17&#xff0c;需要安装后然后在IDEA中选择对应版本&#xff1b;二可能是因为IDEA版本太低&#xff0c;不支持17&#xff0c;需要升级IDEA版本。然后在File->Project Struct…

未雨绸缪,才是真正的高手

由于电脑用了五年半&#xff0c;刚换了新型电脑主机&#xff0c;人老了摸索掌握新操作方法较困难&#xff0c;所以今天的网文作业只好从简&#xff0c;即本“人民体验官”推广人民日报官方微博文化产品《夜读&#xff1a;真正的高手&#xff0c;都懂得凡事提前一步》。 图&…

Flutter常用命令,持续更新

目录 前言 Flutter 常用命令 Dart 常用命令 adb 常用命令&#xff08;用于 Android 开发&#xff09; 前言 当在开发Flutter项目时&#xff0c;熟悉一些常用的命令是非常重要的。这些命令可以帮助你执行各种任务&#xff0c;从构建应用程序到调试和测试。以下是一些Flutte…

Draw.io | 强大并且免费的画图工具

前言 作为一个技术人&#xff0c;总是需要一个称手的画图工具&#xff0c;日常工作中&#xff0c;画的最多的图应该就是流程图&#xff0c;思维导图&#xff0c;如果开发时间比较久的话&#xff0c;可能还需要画架构图。刚开始的时候&#xff0c;我下载了各种工具&#xff0c;像…

Aigtek电压放大器的应用场合有哪些

电压放大器是一种主要用于信号处理的重要电子设备&#xff0c;它可以将输入的低电压信号放大到较高的输出电压水平。在各个应用领域中&#xff0c;电压放大器发挥着重要的作用。下面西安安泰点击将介绍电压放大器的应用场合。 通信系统&#xff1a;电压放大器在通信系统中具有重…