高级.net面试题


1 IsNullOrEmpty()和IsNullOrWhiteSpace()的区别?

IsNullOrEmpty是一个静态方法,它用于检查一个字符串是否为空或者为null。

public static bool IsNullOrEmpty(string value);

IsNullOrWhiteSpace是一个静态方法,它用于检查一个字符串是否为空、为null或者只包含空格。【如果字符串包含特殊字符,或者转义符、或者空格,或者制表符则返回true】

public static bool IsNullOrWhiteSpace(string value);

2 如何理解值传递的原理,string类型

3 String类是否可以被继承?int是否可以被继承

4 string和stringBuilider的区别

5 什么是泛型?泛型的好处有哪些?

6 .net6和.net8有什么区别?

7.netcore里的IOC有哪些

常见的IOC框架:微软.net core 内置的DIAutofacUnity

IOC生命周期:

  • Transient:瞬时生命周期, Transient服务在每次被请求时都会被创建一个新的对象。这种生命周期比较适用于轻量级的无状态服务。
  • Scoped: Scoped生命周期的服务是每次web请求被创建,局部单例对象, 在某个局部内是同一个对象(作用域单例,本质是容器单例);一次请求内是一个单例对象,多次请求则多个不同的单例对象.
  • Singleton: Singleton生命能够周期服务在第一被请求时创建,在后续的每个请求都会使用同一个实例。如果你的应用需要单例服务,推荐的做法是交给服务容器来负责单例的创建和生命周期管理,而不是自己来走这些事情。

8. 各个服务之间是怎么通信的,采用什么方式?

9. async和await这两个关键字可以单独出现吗?

在 C# 中,async 和 await 是两个关键字,用于处理异步编程。它们有特定的用途和规则,不能单独出现。以下是详细的解释:

  1. async 关键字

  2. await

	using System;
	using System.Threading.Tasks;

	public class Program
	{
		public static async Task Main(string[] args)
		{
			Console.WriteLine("开始异步操作");
			await DoWorkAsync();
			Console.WriteLine("异步操作完成");
		}

		public static async Task DoWorkAsync()
		{
			Console.WriteLine("DoWorkAsync 开始");
			await Task.Delay(1000); // 模拟异步操作
			Console.WriteLine("DoWorkAsync 结束");
		}
	}

10 await状态机的原理

11 在同步方法里调用异步方法可能发生什么?

12 进程与线程的理解与区别?

  • 进程
    • 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。
  • 线程
    • 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

多进程和多线程区别

多进程:操作系统中同时运行的多个程序
多线程:在同一个进程中同时运行的多个任务

举个例子,多线程下载软件,可以同时运行多个线程,但是通过程序运行的结果发现,每一次结果都不一致。 因为多线程存在一个特性:随机性。造成的原因:CPU在瞬间不断切换去处理各个线程而导致的,可以理解成多个线程在抢CPU资源


多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高。但是如果多线程有安全问题或出现频繁的上下文切换时,运算速度可能反而更低。

13 C#里的线程池有哪几种?

14 什么是线程互斥?

15 什么是线程同步?

16 并行与并发的区别?

  1. 并发(Concurrency):
  • 定义:并发是指在同一时间段内多个任务同时处于执行状态。这些任务可能在不同的时间点开始和结束,但看起来像是在同时进行。
  • 特点:
    • 并发通常用于提高程序的响应性,特别是在I/O操作较多的情况下。
    • 可以通过多线程、多进程或者异步编程来实现并发。
    • 在单核处理器上,操作系统通过时间片轮转的方式实现任务的并发执行,即快速切换上下文,让每个任务都能得到CPU时间。
  • 应用场景:例如,一个应用程序需要同时处理用户输入、网络请求和文件读写等任务。
  1. 并行(Parallelism):
  • 定义:并行是指在同一时刻,多个任务真正的同时执行
  • 特点:
    • 并行通常用于提高程序的性能,特别是在计算密集型任务中。
    • 需要多核处理器来实现真正的并行执行,每个任务可以在不同的CPU核心上运行。
    • 并行编程可以利用多个处理器核心来同时处理多个计算任务,从而显著减少执行时间。
  • 应用场景:例如,对大数据集进行复杂的数学运算,可以利用多个CPU核心并行处理。

17 什么是线程安全?C#中如何实现线程安全?

18 AOP的实现原理,以及你在项目中实际运用过哪些aop实现;

19 如何做到分库,具体思路设计,无障碍切换库?

20 什么是委托?

委托(Delegate)是C#中的一种类型,用于引用一个或多个方法。委托可以看作是方法的引用或指针,它允许你将方法作为参数传递给其他方法,或者将方法存储在变量中以便后续调用。委托在C#中广泛用于事件处理、回调函数和多线程编程等场景。

21 事件和委托的区别?

主要区别

  1. 封装性:
  • 委托是公开的,可以被任何代码直接调用。
  • 事件是对委托的封装,限制了直接调用,只能通过事件来添加或移除方法。
  1. 安全性:
  • 委托没有额外的安全性保护,外部代码可以直接调用。
  • 事件提供了一层安全性,确保只有发布者能够触发事件。
  1. 用途:
  • 委托用于引用方法,可以用于回调函数、多播操作等。
  • 事件用于实现发布-订阅模式,允许对象在特定条件下通知其他对象。
  1. 声明方式:
  • 委托使用delegate关键字声明。
  • 事件使用event关键字声明,并且必须基于一个委托类型。
  1. 访问控制:
  • 委托实例可以被直接调用和修改。

  • 事件实例只能通过+=和-=操作符订阅和取消订阅,不能直接调用。

    总结:
    委托是一种类型,用于引用一个或多个方法,提供了一种类型安全的方式来调用方法。
    事件是一种机制,基于委托,用于允许对象提供通知,封装了委托的使用,提供了更强的安全性和封装性。

22 怎么做查询优化【针对数据库层面】?

  • 索引优化:创建合适索引,避免使用过多索引。
  • 查询重写:简化查询,避免SELECT *,使用EXISTS代替IN等。
  • 数据库设计优化:规范化和反规范化,使用分区表。
  • 存储引擎优化:选择合适的存储引擎。
  • 查询计划优化:分析和调整查询计划。
  • 缓存查询结果:使用缓存减少数据库负载。
  • 数据分页:使用分页减少一次性加载的数据量。
  • 减少锁竞争:使用合适的锁机制,避免长时间持有锁。
  • 使用覆盖索引:创建覆盖索引提高查询效率。
  • 数据库配置优化:调整数据库配置参数。
  • 使用连接池:使用连接池减少连接开销。
  • 定期维护数据库:定期执行维护任务,确保数据安全。

23 什么情况下会放弃索引,直接进行全表扫描查询?

23 主键索引和普通索引的区别?

24 IOC和AOP【重点】

25 委托和事件【重点】

26 泛型,泛型约束【重点】

27 什么是微服务【重点】

28 微服务的分布式事务【重点】

29 在微服务中什么是一阶段提交,两阶段提交,三阶段提交?

微服务中的分布式事务管理

30 微服务的追踪怎么实现?有哪些开源组件可以用【重点】

31 多线程,async和await异步的实现原理,状态机【重点】

多线程的实现原理

async和await异步的实现原理

32 DDD领域驱动设计【重点】

33 应用服务和领域服务有什么区别?【重点】

34 什么是聚合根和聚合【重点】

35 redis缓存穿透, 缓存雪崩