长沙某公司.Net高级开发面试题

1.dot net core跟dot net比较有哪些更好的地方?

第一是跨平台,它可以运行在三大操作系统上面,windows, Linux和MAC。

第二是对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起。

第三是dot net core处理请求的效率更高,能够处理更多的请求。

第四是dot net core有更多的安装配置方法。

2.什么是依赖注入?什么是控制反转?什么是发射,发射的应用场景?

依赖注入 (DI)是控制反转 (IOC)的一种实现方式,用于减少组件之间的耦合度,通过将依赖的创建和管理权交给外部容器,实现了控制反转。
反射是.NET框架提供的一种机制,允许运行时查询类型的信息,并创建对象实例、调用方法等。这
在某些情况下非常有用,比如在没有编译时类型信息的情况下动态地处理代码。反射可以用于实现诸如依赖注入这样的功能,因为它可以用来创建对象实例而不必直接指定其构造函数。

发射的应用场景:
1.动态创建对象 :当不知道要创建的具体类型时,可以使用反射来根据字符串类型的名称创建对象。
2.动态调用方法 :反射可以用来在运行时确定并调用方法,这对于插件化编程模型很有用。
3.框架和库开发 :许多框架(如ORM框架、MVC框架等)内部都会使用反射来实现其功能。
4.单元测试:反射可以用来访问私有成员,这对于某些单元测试场景可能是必要的。

3.描述一下依赖注入后的服务生命周期?

1. 瞬时(Transient)

每次请求该服务时,都会创建一个新的实例。这意味着每次依赖注入框架请求一个瞬时服务时,都会返回一个新的对象实例。这种方式非常适合那些轻量级、无状态的服务。

2. 作用域(Scoped)

作用域生命周期的服务在每个请求周期内只创建一次。在Web应用中,一个作用域通常对应于一个HTTP请求。在整个请求期间,无论何时请求同一个作用域内的服务,都会返回相同的实例。这种方式适合那些在整个请求过程中需要保持一定状态的服务。

3. 单例(Singleton)

单例生命周期的服务在整个应用程序运行期间只创建一次。无论何时请求同一个单例服务,都会返回最开始创建的那个实例。这种方式适合那些初始化开销较大或者在整个应用中只需要一个共享实例的服务。

4.简要说明一下EF的三种开发模式,您一般会采用哪种模式?说明理由。

常用的三种模式包括Code FirstDatabase FirstModel First

个人选择取决于项目的具体需求和环境。如果是在一个新项目中,尤其是在敏捷开发环境中,我倾向于使用Code First模式,因为它的灵活性更高,能够更好地适应快速迭代的需求,

并且与测试驱动开发结合得更好。此外,Code First模式也更容易与其他现代开发实践(如持续集成/持续部署CI/CD)相结合。

然而,如果项目需要与现有的复杂数据库集成,或者团队对现有的数据库设计已经非常熟悉,那么使用Database First模式可能是更合适的选择

。在这种情况下,选择Database First可以节省前期的设计工作,并确保与现有系统的兼容性。

5.为什么Nginx 性能这么高? 简单说明下

多进程架构和抢占机制 :通过操作系统的抢占式调度和独立的工作进程,减少锁争用和上下文切换,保证高并发处理和高可用性。
事件驱动的异步非阻塞通信模式 :通过非阻塞I/O和高效的事件通知机制,实现了高并发连接的高效处理和低延迟响应。

这种设计使Nginx在处理大量并发连接时表现优异,是其在Web服务器和反向代理领域广受欢迎的主要原因。

6.Nginx怎么处理请求的?

Nginx 的请求处理流程可以概括如下:
1.客户端发送请求到 Nginx 服务器。
2.Nginx 接收到请求并根据配置的监听端口进行处理。
3.根据请求的域名匹配相应的服务器块。
4.如果配置了负载均衡和反向代理,Nginx 将根据算法将请求转发到相应的上游服务器。
5.如果请求匹配了静态文件路径,Nginx 直接返回静态文件。
6.如果请求不匹配静态文件路径,Nginx 将请求转发给后端应用程序服务器进行处理。
7.后端应用程序服务器处理请求并生成响应。
8.Nginx 将后端服务器返回的响应返回给客户端。

7.MySQL事务的四大特性,MySQL如何优化?

MySQL 事务的四大特性通常指的是ACID特性,即原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation)、持久性

1.优化查询语句:避免使用SELECT *,只选择需要的字段;使用索引来加快查询速度;避免使用慢查询。

2.优化表结构:使用适当的数据类型,避免使用过大的数据类型;合理使用索引,但不过度索引;避免使用太多的关联查询。

3.设置适当的缓存:启用查询缓存,可以缓存查询结果,提高查询性能;设置适当的缓冲区大小,如查询缓冲区、排序缓冲区和连接缓冲区。

4.定期维护数据:删除不需要的数据,优化表碎片;定期进行数据备份和优化。

5.调整MySQL配置:适当增加缓冲区大小,如innodb_buffer_pool_size;调整并发连接数,如max_connections;合理分配CPU和内存资源。

6.使用MySQL性能分析工具:如Explain命令分析查询的执行计划,找出慢查询;使用MySQL的性能监控工具如Performance Schema来监控数据库性能。

7.使用主从复制:将读写操作分离,从库用于读操作,主库用于写操作,提高数据库的读写性能。

8.使用分区表:将大表分成多个小表,提高查询速度和管理效率。

9.使用连接池:使用连接池来管理数据库连接,减少创建和关闭连接的开销。

8.MySQL在某些情况下不使用索引?

1.数据量太小:当表中的数据量非常少时,全表扫描可能比使用索引查找更快,因为索引的额外维护和查找成本可能超过直接扫描表的成本。

2.索引选择性低:如果索引列的值重复度很高(比如性别列,只有"男"和"女"两个值),索引的选择性就很低,这意味着使用索引可能并不会明显减少需要检查的行数,这时MySQL查询优化器可能会决定放弃使用索引而选择全表扫描。

3.类型转换:在查询条件中,如果索引列与比较值之间存在类型不匹配,需要进行类型转换,这可能导致索引失效。特别是当字符串类型的索引列被数字类型值比较时,索引通常无法使用。

4.函数或表达式使用:在WHERE子句中,如果对索引列使用了函数或复杂的表达式,索引可能无法被有效利用,因为索引是基于列的原始值建立的。

5.全表扫描更优:在一些情况下,MySQL的查询优化器会判断全表扫描比使用索引更高效,比如当查询预计返回的行数超过表中数据行的大约25%时。

6.OR条件:当查询条件中使用了OR操作符,即使其中部分条件有索引,MySQL也可能因为OR逻辑的复杂性而放弃使用索引。

7.最左前缀原则:对于复合索引(多列索引),如果查询条件没有从索引的第一列开始,那么后续的列索引将无法被利用。

8.LIKE操作符:当LIKE操作符以通配符(%)开头时,索引无法被有效利用,因为这要求对索引进行全扫描。

9.索引维护成本:在高并发写入的场景下,频繁的索引更新可能会导致性能瓶颈,MySQL可能会选择牺牲查询性能以减少索引维护开销。

9.数据库建立索引的优缺点?

优点

1.提高查询速度:索引可以加快检索数据的速度,尤其是在大型数据库中。通过索引,数据库管理系统可以迅速定位到所需的数据行,而不需要全表扫描。

2.加速排序和分组操作:对于涉及排序(ORDER BY)和分组(GROUP BY)的查询,如果相应的列上有索引,那么数据库可以更快地完成这些操作。

3.支持唯一性和完整性:索引可以用来强制实施唯一性约束,例如唯一索引可以防止插入重复记录,确保数据的完整性和一致性。

4.减少I/O操作:通过使用索引,数据库可以减少磁盘I/O操作的数量,因为在索引树中查找数据通常比在实际数据页中查找要快得多。
缺点

1.增加存储空间:索引本身需要存储空间,尤其是在大型数据库中,索引可能会占用相当大的磁盘空间。

2.降低写操作性能:创建、更新和删除索引会影响写操作的性能。当插入、更新或删除数据行时,相关的索引也需要进行相应的更新,这增加了操作的时间。

3.索引维护成本:每当数据发生变化时(如INSERT、UPDATE、DELETE),索引也需要被更新,这增加了维护成本。

4.可能不总是被使用:在某些情况下,数据库优化器可能会选择不使用索引,尤其是当索引选择性不高或统计信息过时时。这可能会导致索引并未发挥预期的作用。

10.Redis的基本数据结构类型有哪些?

String(字符串)

字符串是最简单的数据类型,可以存储二进制安全字符串或整数,常用于简单的键值对存储。

示例命令:SET key "Hello"
Hash(哈希)

哈希允许你将一个键关联多个字段-值对,非常适合存储对象。

示例命令:HSET user:1 name "John" age 30
List(列表)

列表是链表类型的结构,可以用来存储一系列元素,非常适合用作队列。

示例命令:LPUSH list:1 "item1" "item2"
Set(集合)

集合存储唯一的元素集合,可以用来做去重操作。

示例命令:SADD set:1 "item1" "item2"
Sorted Set(有序集合)

有序集合和集合类似,但是每个元素都有一个分数(score)与之关联,这使得有序集合可以按分数进行排序。

示例命令:ZADD sortedset:1 1 "item1" 2 "item2"

除了这些基本的数据类型之外,Redis 还支持一些高级数据类型和特性,如:

BitMap(位图)

位图是一种特殊的字符串数据类型,用于存储位数组,非常适合用于如统计日志、用户活跃度等场景。

示例命令:SETBIT bitmap:1 0 1
HyperLogLog

HyperLogLog 是一种用于估算大量数据中不同元素的数量的数据结构,非常适合用于统计不重复的元素数量。

示例命令:PFADD hllkey element1 element2
Stream(流)

流是Redis 5.0引入的新数据类型,类似于列表,但主要用于构建消息队列和实时分析系统。

示例命令:XADD streamkey * field value

11.Redis的常用应用场景有哪些?请具体描述2个实际业务案例。

Redis的常见应用场景包括会话缓存、全页缓存、队列系统、排行榜、发布/订阅、计数器等。

会话缓存

在Web应用中,可以将用户的会话数据存储在Redis中,而不是将数据存储在服务器的内存中。

全页缓存

可以将页面的HTML或其他内容保存到Redis中,以便快速检索和显示。

队列系统

Redis提供了列表和发布/订阅等数据类型,可以作为消息队列使用。

排行榜

可以使用Redis的有序集合(sorted set)来存储排行榜数据,用户可以轻松地查询最高的用户或项目。

计数器

Redis的INCR命令可以创建计数器,用于记录页面访问量、事件发生次数等。

分布式锁

Redis可以使用SETNX命令来实现分布式锁,确保同一时间只有一个客户端可以执行特定操作。

其他应用

除了上述应用场景,Redis还有很多其他的应用,例如:缓存数据库查询结果、作为缓存服务器使用、实现PV/UV统计等。

12.什么是跨域,为什么会出现跨域问题?怎么解决?

答:因为同源策略;跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号(如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题,比如a标签、script标签、甚至form标签(可以直接跨域发送数据并接收数据)等

第一种,服务器执行请求过来以后,允许你跨域;其实服务器设置响应头:response.setHeader("Access-Control-Allow-Origin", "*")

第二种,jsonp,jsonp的方式,注意这种方式只能发送get请求,就算指定为post,最后发送的还是get,且跟上面方式一样,也需要服务器的配合支持。jsonp发送的并不是ajax请求;利用动态创建一个script标签,因为script标签是没有同源策略限制的,是可以跨域的; 把这个script标签的src指向我们请求的服务端地址,这个地址会携带一个参数:callback ,一个回调函数,服务端会把数据通过这个回调函数返回给客户端,但是客户端没有这个函数怎么接收呢?所以在发送请求之前,要在全局(window)注册这样一个方法,利用这个方法,来获得数据; 这个回调函数名需要跟服务端约定好,是一致的。

13.如果页面中图片太多,从性能上来说,如何提高性能?

答:

1.方案一:将图片服务和应用服务分离(从架构师的角度思考)

  1. 图片懒加载:像淘宝或者京东这样的APP页面上有很多图片,当我们滑到下一屏时下一屏的图片才会加载,这就采用了图片懒加载的方式.

  2. css Sprites:当网站或者APP有大量小icon,如果上传到图片服务器比如CDN, 要加载所有这些小icon将增加大量请求,而CDN是按流量收费的,这无疑将增加很多成本.

CSS Sprites 技术早已不新鲜,就是将这些小icon合并成一张图片,只需要加载一次,每次通过background-position来控制显示icon,这样就可以节约大量请求,节约成本.

14.什么是死锁?如何保证你实现的锁结果不发生死锁?

‌死锁‌是指在多任务环境中,由于资源分配不当或进程运行顺序不合理,导致一组进程都在等待其他进程释放资源而无法继续执行的一种状态。

死锁的发生通常满足四个必要条件:互斥条件、请求和保持条件、不剥夺条件、环路等待条件。这些条件共同作用,使得进程之间形成了一种僵持局面,导致系统无法继续向前推进。

为了保证实现的锁结果不发生死锁,可以采取以下策略:

‌预防死锁‌:通过破坏死锁产生的四个条件,将死锁的发生概率降低。这包括确保资源有足够的供应、采用资源分配图和安全状态理论来避免进入不安全状态、实施银行家算法来预分配资源、以及设计操作系统以避免死锁的发生‌1。

‌避免死锁‌:通过安全序列算法分析资源分配状态,确保系统处于可安全执行状态,从而避免死锁的发生‌2。

‌检测死锁‌:通过资源分配图等方法判断系统是否处于死锁状态,如处于死锁状态则进行相应的处理,如进程终止、资源抢占等‌2。

‌解除死锁‌:当系统检测到死锁发生时,采取一定的策略对死锁进行解除,如资源重新分配或进程终止等‌2。

15.Vue的生命周期,各个生命周期的作用?

创建阶段

beforeCreate: 在实例被创建之后立即调用,此时还未初始化数据(data),也无法访问到 this 属性。

created: 实例创建完成后被调用,此时数据已经被初始化,可以访问 this 属性,但 $el 还未被渲染。
挂载阶段

beforeMount: 实例将要被挂载到 DOM 上时调用,此时 Vue 实例已经完成了数据观测、属性计算、watcher 设置等,但还没有渲染到 DOM 上。

mounted: 实例被挂载到 DOM 上后调用,此时可以访问到真实的 DOM 节点。
更新阶段

beforeUpdate: 数据更新时调用,此时可以访问到新的数据,但 $el 尚未更新。

updated: 数据更新并且 $el 也重新渲染后调用。
销毁阶段

beforeDestroy: 实例销毁之前调用,此时仍然可以访问到所有的实例属性。

destroyed: 实例销毁之后调用,此时 Vue 实例已经完全被销毁,不能再访问到任何实例属性。

16.v-show 与 v-if 的区别

渲染方式的不同
v-show : 当表达式结果为 false 时,元素仍然保留在 DOM 中,只是通过 CSS 的 display: none; 属性隐藏。
v-if : 当表达式结果为 false 时,DOM 元素将被移除,即条件渲染。
性能的影响

v-show: 切换速度快,因为元素始终存在于 DOM 中,只是显示状态改变。

v-if: 初次渲染较慢,但切换速度更快,尤其是在频繁切换时,因为每次切换都需要重新渲染 DOM。
适用场景

v-show: 适合频繁切换显示状态的情况。

v-if: 适合条件不经常改变的情况,特别是用于条件渲染较大的模板结构时。

17.Class 与 Style 的动态绑定

在 Vue 中,可以使用 v-bind:classv-bind:style(通常简写为 :class 和 :style)来动态绑定类名和样式。

18.父子组件传值

在 Vue 中,父组件向子组件传值主要通过 props 属性来实现,而子组件向父组件传值则通过自定义事件**($emit)**来实现。

相关推荐
Pandaconda14 分钟前
【计算机网络 - 基础问题】每日 3 题(二十六)
开发语言·经验分享·笔记·后端·计算机网络·面试·职场和发展
Passion不晚1 小时前
【面试题】mysql中怎么保持主从数据库一致
数据库·mysql·面试
CuPhoenix2 小时前
【沧海拾昧】C# .NET8 WinForms程序在主显示器125%/150%缩放下尺寸显示异常的解决办法
c#·.net·winforms
Pandaconda2 小时前
【计算机网络 - 基础问题】每日 3 题(二十三)
开发语言·网络·笔记·后端·计算机网络·面试·职场和发展
吃海鲜的骆驼3 小时前
六、设计模式-6.1、单例模式
java·单例模式·设计模式·面试
Pandaconda3 小时前
【计算机网络 - 基础问题】每日 3 题(二十五)
开发语言·经验分享·笔记·后端·计算机网络·面试·职场和发展
小明菜菜4 小时前
面试经典150题 堆
数据结构·算法·面试
python资深爱好者7 小时前
VB.NET中如何利用LINQ to SQL进行数据库操作
数据库·.net·linq
小白7 小时前
.NET 6.0 WebAPI 使用JWT生成Token的验证授权
.net
Net开发-孔明8 小时前
.Net Web项目中,实现轻量级本地事件总线 框架
.net·事件总线