
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 内置的DI、Autofac、Unity
IOC生命周期:
- Transient:瞬时生命周期, Transient服务在每次被请求时都会被创建一个新的对象。这种生命周期比较适用于轻量级的无状态服务。
- Scoped: Scoped生命周期的服务是每次web请求被创建,局部单例对象, 在某个局部内是同一个对象(作用域单例,本质是容器单例);一次请求内是一个单例对象,多次请求则多个不同的单例对象.
- Singleton: Singleton生命能够周期服务在第一被请求时创建,在后续的每个请求都会使用同一个实例。如果你的应用需要单例服务,推荐的做法是交给服务容器来负责单例的创建和生命周期管理,而不是自己来走这些事情。
8. 各个服务之间是怎么通信的,采用什么方式?
9. async和await这两个关键字可以单独出现吗?
在 C# 中,async 和 await 是两个关键字,用于处理异步编程。它们有特定的用途和规则,不能单独出现。以下是详细的解释:
-
async 关键字
-
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 并行与并发的区别?
- 并发(Concurrency):
- 定义:并发是指在同一时间段内,多个任务同时处于执行状态。这些任务可能在不同的时间点开始和结束,但看起来像是在同时进行。
- 特点:
- 并发通常用于提高程序的响应性,特别是在I/O操作较多的情况下。
- 可以通过多线程、多进程或者异步编程来实现并发。
- 在单核处理器上,操作系统通过时间片轮转的方式实现任务的并发执行,即快速切换上下文,让每个任务都能得到CPU时间。
- 应用场景:例如,一个应用程序需要同时处理用户输入、网络请求和文件读写等任务。
- 并行(Parallelism):
- 定义:并行是指在同一时刻,多个任务真正的同时执行。
- 特点:
- 并行通常用于提高程序的性能,特别是在计算密集型任务中。
- 需要多核处理器来实现真正的并行执行,每个任务可以在不同的CPU核心上运行。
- 并行编程可以利用多个处理器核心来同时处理多个计算任务,从而显著减少执行时间。
- 应用场景:例如,对大数据集进行复杂的数学运算,可以利用多个CPU核心并行处理。
17 什么是线程安全?C#中如何实现线程安全?
18 AOP的实现原理,以及你在项目中实际运用过哪些aop实现;
19 如何做到分库,具体思路设计,无障碍切换库?
20 什么是委托?
委托(Delegate)是C#中的一种类型,用于引用一个或多个方法。委托可以看作是方法的引用或指针,它允许你将方法作为参数传递给其他方法,或者将方法存储在变量中以便后续调用。委托在C#中广泛用于事件处理、回调函数和多线程编程等场景。
21 事件和委托的区别?
主要区别
- 封装性:
- 委托是公开的,可以被任何代码直接调用。
- 事件是对委托的封装,限制了直接调用,只能通过事件来添加或移除方法。
- 安全性:
- 委托没有额外的安全性保护,外部代码可以直接调用。
- 事件提供了一层安全性,确保只有发布者能够触发事件。
- 用途:
- 委托用于引用方法,可以用于回调函数、多播操作等。
- 事件用于实现发布-订阅模式,允许对象在特定条件下通知其他对象。
- 声明方式:
- 委托使用delegate关键字声明。
- 事件使用event关键字声明,并且必须基于一个委托类型。
- 访问控制:
-
委托实例可以被直接调用和修改。
-
事件实例只能通过+=和-=操作符订阅和取消订阅,不能直接调用。
总结:
委托是一种类型,用于引用一个或多个方法,提供了一种类型安全的方式来调用方法。
事件是一种机制,基于委托,用于允许对象提供通知,封装了委托的使用,提供了更强的安全性和封装性。
22 怎么做查询优化【针对数据库层面】?
- 索引优化:创建合适索引,避免使用过多索引。
- 查询重写:简化查询,避免SELECT *,使用EXISTS代替IN等。
- 数据库设计优化:规范化和反规范化,使用分区表。
- 存储引擎优化:选择合适的存储引擎。
- 查询计划优化:分析和调整查询计划。
- 缓存查询结果:使用缓存减少数据库负载。
- 数据分页:使用分页减少一次性加载的数据量。
- 减少锁竞争:使用合适的锁机制,避免长时间持有锁。
- 使用覆盖索引:创建覆盖索引提高查询效率。
- 数据库配置优化:调整数据库配置参数。
- 使用连接池:使用连接池减少连接开销。
- 定期维护数据库:定期执行维护任务,确保数据安全。