netcore 高频面试题总结,保你找到满意的工作
不想当项目经理的程序员他不是一个好厨子。目前已经拿到pmp,acp证书,但是目前仍然是做net开发相关,希望以后有机会可以转型成功。
这里我会整理一下netcore生态下各个知识点,面试常问的地方,希望可以帮助到大家,大家都可以找到一份自己满意的工作(目前楼主在东软干的fm,os:沈阳core太少啊,啥时候替换掉java啊)。我会慢慢整理这些内容,文中如果有错误的地方,希望能够帮忙指出修正,避免误导他人,谢谢!如果感兴趣可以私我交流哦~~~
基础
1、什么是aop?
面向切面编程
2、什么是托管和非托管?
托管代码:是由公共语言运行库(clr)执行的代码,而不是由操作系统直接执行。有关内存管理(内存申请,内存释放,垃圾回收之类的)全部都是.net的clr来管理
非托管代码:直接编译成目标计算机码,由操作系统直接执行的代码,内存回收要继承idisposable接口手动回收
3、string和stringbuilder的区别
string 每次内容发生变化,都会生成一个新对象,重新分配内存
stringbuilder 每次操作都是对自身进行操作,而不是生成新的对象
4、ref和out的区别
ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。
5、重载与重写
overload重载:同一个类下,相同的函数名,不同参数列表
override重写:是对父类的方法进行重写;基类函数用virtual修饰,派生类用override修饰
注:不能重写非虚方法或静态方法
6、一个类可以继承几个父类,几个接口?
在创建一个类的时候只能继承一个父类 但可以实现多个接口
7、委托和事件,委托中action和func的区别用法
委托是面向对象的、类型安全的,是引用类型。使用delegate关键字进行定义
详解:
8、常用修饰符
public: 同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。
private: 只有同一类或结构中的代码可以访问该类型或成员。
protected: 只有同一类或结构或者此类的派生类中的代码才可以访问该类型或成员。
internal: 同一程序集中的任何代码都可以访问该类型或成员,但别的代码不可以。
9、c#中,string str = null 与 string str =""的区别
string str=null没有分配内存,string str=""分配了内存
10、是否可以继承string类
string类是一个最终类,被final修饰,所以不能被继承
11、string s = new string("xyz");创建了几个string object?
两个对象,一个是“xyx”,一个是指向“xyx”的引用对像s。
12、堆和栈
引用类型存在堆上,值类型存在栈上
13、什么是gc。idispose的用法
gc,垃圾回收器,用于自动回收托管堆中无效对象的内存,释放内存空间。
程序在运行过程中 ,有很多对象分配内存空间后,使用一次就不再使用了,这不仅占用内存空间,导致内存溢出,还可能影响程序的性能。所以我们自动释放内存
原理可参考:
14、抽象类abstract class与接口interface的异同
同:都不能被实例化。都可以被继承。都可以包含方法声明。派生类必须实现抽象类(接口)中未实现的方法。
异:接口可以被多重实现,抽象类只能被单一继承。
15、using关键字的使用场景
作为指令:用于导入其他命名空间中定义的类型或为命名空间创建别名
作为语句:用于定义一个范围,在此范围的末尾将释放对象
16、task异步用法,它和thread有什么区别?
17、异步方调用同步方法和同步方法调用异步方法性能上有什么区别?
18、静态类在程序的生命周期,何时初始化,静态类的静态方法和类的静态方法啥区别
19、ef 性能优化
20、ef 实现原理
21、如何实现单例模式?
netcore基础
1、什么是依赖注入?
依赖注入是asp.net core的核心,依赖注入我们可以分开来理解
依赖:当一个类需要另一个类协作来完成工作的时候就产生了依赖
注入:把依赖的创建丢给其它人,自己只负责使用,其它人丢给你依赖的这个过程理解为注入。
startup configureservices方法 可以使用netcore自带的di或者使用第三方autofac
jesse大佬文章:
2、netcore服务生命周期,请详细说明
transient:每一次getservice都会创建一个新的实例
scoped:在同一个scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
singleton:整个应用程序生命周期内只创建一个实例
3、ioc的理解
ioc容器就是一个工厂,负责创建对象的
ioc控制反转:只是把上端对下端的依赖,换成第三方容器决定
博客:
4、netcore中间件
中间件在这里是指注入到应用中处理请求和响应的组件。
startup configure方法
数据库
1、mysql的数据引擎有哪些
myisam
innodb
2、数据库事务
3、什么是sql注入?
利用sql语言漏洞获得合法身份登陆系统
4、微服务下怎么做数据同步
5、数据库优化
设计:存储引擎,字段类型,范式与逆范式
功能:索引,缓存,分区分表。
架构:主从复制,读写分离,负载均衡。
详解:
6、数据库聚集索引和非聚集索引,什么情况会失效
架构,设计思想,微服务
1.谈一谈对ddd的理解
ddd,领域驱动设计。就是通过领域来指导软件设计,是一种十分抽象的软件设计思想,它主要分为战略设计和战术设计
战略方面,通过事件风暴进行领域模型的划分,划分出核心域,子域,支撑域,定义通用语言,划分出界限上下文。
在战术设计方面,ddd将架构分层,“松耦合,高内聚”是架构设计的整体思想。按照ddd思想,可以分为领域层,基础设施层,应用层,接口层。
接口层为前端用户提供api接口。基础设施层可以放一些第三方的服务,数据库连接等内容。应用层是对领域服务的编排,是很薄的一层(目前我自己的架构,应用的是cqrs,所有的相关逻辑都是放在了应用层,而领域层只是放了实体,因为暂时还不是特别理解领域层的服务和事件都应该写什么)。领域层包括实体,值对象,聚合根,领域服务,领域事件等内容
2.ddd四种领域模型
1、失血模型
失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类,所有的业务逻辑完全由business object来完成
2、贫血模型
简单来说,就是domain ojbect包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到service层。
3、充血模型
充血模型和第二种模型差不多,所不同的就是如何划分业务逻辑,即认为,绝大多业务逻辑都应该被放在domain object里面(包括持久化逻辑),而service层应该是很薄的一层,仅仅封装事务和少量逻辑,不和dao层打交道。
4、胀血模型
基于充血模型的第三个缺点,干脆取消service层,只剩下domain object和dao两层,在domain object的domain logic上面封装事务。
4.微服务优缺点
优点
1、微服务是松藕合的,无论是在开发阶段或部署阶段都是独立的。
2、能够快速响应, 局部修改容易, 一个服务出现问题不会影响整个应用。
3、易于和第三方应用系统集成, 支持使用不同的语言开发, 允许你利用融合最新技术。
4、每个微服务都很小,足够内聚,足够小,代码容易理解。团队能够更关注自己的工作成果, 聚焦指定的业务功能或业务需求。
5、开发简单、开发效率提高,一个服务可能就是专一的只干一件事, 能够被小团队单独开发,这个小团队可以是 2 到 5 人的开发人员组成。
缺点:
1、微服务架构带来过多的运维操作, 可能需要团队具备一定的 devops 技巧.
2、分布式系统可能复杂难以管理。因为分布部署跟踪问题难。当服务数量增加,管理复杂性增加。
5.consul的好处
consul是分布式的、高可用、横向扩展的
参考:
6.熔断限流
7、什么是分布式,微服务如何进行拆分?
docker
1.docker常用命令
docker images //查看所有镜像文件 docker ps //查看运行中的容器 docker ps -a //查看所有容器 docker exec -it xx /bin/bash //进入容器内部 docker logs -f xx //查看容器日志 docker run //启动容器 docker login //登录镜像仓库 docker pull //拉取镜像 docker push //推送镜像 docker save -o //将指定镜像保存成 tar 归档文件 docker load -i //导入使用 [docker save] 命令导出的镜像 docker cp //用于容器与主机之间的数据拷贝 docker history //查看指定镜像的创建历史。 docker build //用于使用 dockerfile 创建镜像。 docker tag // 标记本地镜像,将其归入某一仓库。
redis
1.redis数据类型以及使用场景
string 字符串(可以为整形、浮点型和字符串,统称为元素)
list 列表(实现队列,元素不唯一,先入先出原则)
set 集合(各不相同的元素)
hash hash散列值(hash的key必须是唯一的,hash 特别适合用于存储对象)
sort set 有序集合
2.缓存雪崩,缓存击穿
缓存雪崩:在请求redis的时候,key大面积失效,导致大量请求到数据库
缓存击穿:在请求数据的时候,key值不存在或者失效,导致请求直接穿透到数据库进行请求
3.数据同步
4.过期时间机制
5.redis持久化方式以及优缺点
rdb:
rdb持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式.
1、rdb文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
2、生成rdb文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘io操作。
3、rdb 在恢复大数据集时的速度比 aof 的恢复速度要快。
劣势
rdb快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。
aof:
redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。
优势:
1、aof可以更好的保护数据不丢失,一般aof会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。
2、aof日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。
3、aof日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。
4、aof日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝aof文件,将最后一条flushall命令给删了,然后再将该aof文件放回去,就可以通过恢复机制,自动恢复所有数据
劣势:
1、对于同一份数据来说,aof日志文件通常比rdb数据快照文件更大
2、aof开启后,支持的写qps会比rdb支持的写qps低,因为aof一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
3、以前aof发生过bug,就是通过aof记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。
6、redis 单机最大存储量
7、哨兵模式
mq事件总线
消息队列的优势
1、系统解耦
2、流量削峰
1、mq工作模式以及详细过程
1、简单模式
说明:一个生产者p发送消息到队列q,一个消费者c接收
2、工作队列模式work queue
说明:一个生产者,多个消费者,每个消费者获取到的消息唯一,多个消费者只有一个队列
3、发布/订阅模式publish/subscribe
说明:一个生产者发送的消息会被多个消费者获取。一个生产者、一个交换机、多个队列、多个消费者
4、路由模式routing
说明:生产者发送消息到交换机并且要指定路由key,消费者将队列绑定到交换机时需要指定路由key
5、通配符模式topics
说明:生产者p发送消息到交换机x,type=topic,交换机根据绑定队列的routing key的值进行通配符匹配;符号#:匹配一个或者多个词lazy.# 可以匹配lazy.irs或者lazy.irs.cor
2、mq数据丢失怎么处理
常用设计模式,目的
restful api graphql
graphql
上一篇: TP5框架简单登录功能实现方法示例