高级.net面试题
<h2 id="1-isnullorempty和isnullorwhitespace的区别">1 IsNullOrEmpty()和IsNullOrWhiteSpace()的区别?</h2><p>IsNullOrEmpty是一个静态方法,它用于检查一个字符串是否为空或者为null。</p>
<pre><code>public static bool IsNullOrEmpty(string value);
</code></pre>
<p>IsNullOrWhiteSpace是一个静态方法,它用于检查一个字符串是否为空、为null或者只包含空格。【如果字符串包含特殊字符,或者转义符、或者空格,或者制表符则返回true】</p>
<pre><code>public static bool IsNullOrWhiteSpace(string value);
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202412/2212230-20241224184116134-734779621.png"></p>
<h2 id="2-如何理解值传递的原理string类型">2 如何理解值传递的原理,string类型</h2>
<h2 id="3-string类是否可以被继承int是否可以被继承">3 String类是否可以被继承?int是否可以被继承</h2>
<h2 id="4-string和stringbuilider的区别">4 string和stringBuilider的区别</h2>
<h2 id="5-什么是泛型泛型的好处有哪些">5 什么是泛型?泛型的好处有哪些?</h2>
<h2 id="6-net6和net8有什么区别">6 .net6和.net8有什么区别?</h2>
<h2 id="7netcore里的ioc有哪些">7.netcore里的IOC有哪些</h2>
<p>常见的IOC框架:微软.net core 内置的<strong>DI</strong>、<strong>Autofac</strong>、<strong>Unity</strong></p>
<p>IOC生命周期:</p>
<ul>
<li><strong>Transient</strong>:瞬时生命周期, Transient服务在每次被请求时都会被创建一个新的对象。这种生命周期比较适用于轻量级的无状态服务。</li>
<li><strong>Scoped</strong>: Scoped生命周期的服务是每次web请求被创建,局部单例对象, 在某个局部内是同一个对象(作用域单例,本质是容器单例);一次请求内是一个单例对象,多次请求则多个不同的单例对象.</li>
<li><strong>Singleton</strong>: Singleton生命能够周期服务在第一被请求时创建,在后续的每个请求都会使用同一个实例。如果你的应用需要单例服务,推荐的做法是交给服务容器来负责单例的创建和生命周期管理,而不是自己来走这些事情。</li>
</ul>
<h2 id="8-各个服务之间是怎么通信的采用什么方式">8. 各个服务之间是怎么通信的,采用什么方式?</h2>
<h2 id="9-async和await这两个关键字可以单独出现吗">9. async和await这两个关键字可以单独出现吗?</h2>
<p>在 C# 中,async 和 await 是两个关键字,用于处理异步编程。它们有特定的用途和规则,不能单独出现。以下是详细的解释:</p>
<ol>
<li>
<p>async 关键字<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202412/2212230-20241224210146403-761448151.png"></p>
</li>
<li>
<p>await<br>
<img src="https://img2024.cnblogs.com/blog/2212230/202412/2212230-20241224210210286-1917169133.png"></p>
</li>
</ol>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202412/2212230-20241224210234793-1383053111.png"></p>
<pre><code> 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 结束");
}
}
</code></pre>
<h2 id="10-await状态机的原理">10 await状态机的原理</h2>
<h2 id="11-在同步方法里调用异步方法可能发生什么">11 在同步方法里调用异步方法可能发生什么?</h2>
<h2 id="12-进程与线程的理解与区别">12 进程与线程的理解与区别?</h2>
<ul>
<li>进程
<ul>
<li>一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。</li>
</ul>
</li>
<li>线程
<ul>
<li>进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。</li>
</ul>
</li>
</ul>
<p><strong>根本区别</strong>:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位</p>
<p><strong>资源开销</strong>:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。</p>
<p><strong>包含关系</strong>:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。</p>
<p><strong>内存分配</strong>:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的</p>
<p><strong>影响关系</strong>:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。</p>
<p><strong>执行过程</strong>:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行</p>
<p><strong>多进程和多线程区别</strong></p>
<p>多进程:操作系统中同时运行的多个程序<br>
多线程:在同一个进程中同时运行的多个任务</p>
<p>举个例子,多线程下载软件,可以同时运行多个线程,但是通过程序运行的结果发现,每一次结果都不一致。 因为多线程存在一个特性:<strong>随机性</strong>。造成的原因:<strong>CPU在瞬间不断切换去处理各个线程而导致的,可以理解成多个线程在抢CPU资源</strong>。</p>
<p><img src="https://img2024.cnblogs.com/blog/2212230/202412/2212230-20241225125849358-383576202.png"><br>
多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高。但是如果多线程有安全问题或出现频繁的上下文切换时,运算速度可能反而更低。</p>
<h2 id="13-c里的线程池有哪几种">13 C#里的线程池有哪几种?</h2>
<h2 id="14-什么是线程互斥">14 什么是线程互斥?</h2>
<h2 id="15-什么是线程同步">15 什么是线程同步?</h2>
<h2 id="16-并行与并发的区别">16 并行与并发的区别?</h2>
<ol>
<li>并发(Concurrency):</li>
</ol>
<ul>
<li>定义:并发是指在<strong>同一时间段内</strong>,<strong>多个任务同时处于执行状态</strong>。这些任务可能在不同的时间点开始和结束,但看起来像是在同时进行。</li>
<li>特点:
<ul>
<li>并发通常用于提高程序的响应性,特别是在I/O操作较多的情况下。</li>
<li>可以通过多线程、多进程或者异步编程来实现并发。</li>
<li>在单核处理器上,操作系统通过时间片轮转的方式实现任务的并发执行,即快速切换上下文,让每个任务都能得到CPU时间。</li>
</ul>
</li>
<li>应用场景:例如,一个应用程序需要同时处理用户输入、网络请求和文件读写等任务。</li>
</ul>
<ol start="2">
<li>并行(Parallelism):</li>
</ol>
<ul>
<li>定义:并行是指在<strong>同一时刻</strong>,多个任务<strong>真正的同时执行</strong>。</li>
<li>特点:
<ul>
<li>并行通常用于提高程序的性能,特别是在计算密集型任务中。</li>
<li>需要多核处理器来实现真正的并行执行,每个任务可以在不同的CPU核心上运行。</li>
<li>并行编程可以利用多个处理器核心来同时处理多个计算任务,从而显著减少执行时间。</li>
</ul>
</li>
<li>应用场景:例如,对大数据集进行复杂的数学运算,可以利用多个CPU核心并行处理。</li>
</ul>
<h2 id="17-什么是线程安全c中如何实现线程安全">17 什么是线程安全?C#中如何实现线程安全?</h2>
<h2 id="18-aop的实现原理以及你在项目中实际运用过哪些aop实现">18 AOP的实现原理,以及你在项目中实际运用过哪些aop实现;</h2>
<h2 id="19-如何做到分库具体思路设计无障碍切换库">19 如何做到分库,具体思路设计,无障碍切换库?</h2>
<h2 id="20-什么是委托">20 什么是委托?</h2>
<p><strong>委托(Delegate)</strong>是C#中的一种类型,用于引用一个或多个方法。委托可以看作是方法的引用或指针,它允许你将方法作为参数传递给其他方法,或者将方法存储在变量中以便后续调用。委托在C#中广泛用于事件处理、回调函数和多线程编程等场景。</p>
<h2 id="21-事件和委托的区别">21 事件和委托的区别?</h2>
<p><strong>主要区别</strong></p>
<ol>
<li>封装性:</li>
</ol>
<ul>
<li>委托是公开的,可以被任何代码直接调用。</li>
<li>事件是对委托的封装,限制了直接调用,只能通过事件来添加或移除方法。</li>
</ul>
<ol start="2">
<li>安全性:</li>
</ol>
<ul>
<li>委托没有额外的安全性保护,外部代码可以直接调用。</li>
<li>事件提供了一层安全性,确保只有发布者能够触发事件。</li>
</ul>
<ol start="3">
<li>用途:</li>
</ol>
<ul>
<li>委托用于引用方法,可以用于回调函数、多播操作等。</li>
<li>事件用于实现发布-订阅模式,允许对象在特定条件下通知其他对象。</li>
</ul>
<ol start="4">
<li>声明方式:</li>
</ol>
<ul>
<li>委托使用delegate关键字声明。</li>
<li>事件使用event关键字声明,并且必须基于一个委托类型。</li>
</ul>
<ol start="5">
<li>访问控制:</li>
</ol>
<ul>
<li>
<p>委托实例可以被直接调用和修改。</p>
</li>
<li>
<p>事件实例只能通过+=和-=操作符订阅和取消订阅,不能直接调用。</p>
<p><strong>总结:</strong><br>
委托是一种类型,用于引用一个或多个方法,提供了一种类型安全的方式来调用方法。<br>
事件是一种机制,基于委托,用于允许对象提供通知,封装了委托的使用,提供了更强的安全性和封装性。</p>
</li>
</ul>
<h2 id="22-怎么做查询优化针对数据库层面">22 怎么做查询优化【针对数据库层面】?</h2>
<ul>
<li>索引优化:创建合适索引,避免使用过多索引。</li>
<li>查询重写:简化查询,避免SELECT *,使用EXISTS代替IN等。</li>
<li>数据库设计优化:规范化和反规范化,使用分区表。</li>
<li>存储引擎优化:选择合适的存储引擎。</li>
<li>查询计划优化:分析和调整查询计划。</li>
<li>缓存查询结果:使用缓存减少数据库负载。</li>
<li>数据分页:使用分页减少一次性加载的数据量。</li>
<li>减少锁竞争:使用合适的锁机制,避免长时间持有锁。</li>
<li>使用覆盖索引:创建覆盖索引提高查询效率。</li>
<li>数据库配置优化:调整数据库配置参数。</li>
<li>使用连接池:使用连接池减少连接开销。</li>
<li>定期维护数据库:定期执行维护任务,确保数据安全。</li>
</ul>
<h2 id="23-什么情况下会放弃索引直接进行全表扫描查询">23 什么情况下会放弃索引,直接进行全表扫描查询?</h2>
<h2 id="23-主键索引和普通索引的区别">23 主键索引和普通索引的区别?</h2>
<h2 id="24-ioc和aop重点">24 IOC和AOP【重点】</h2>
<h2 id="25-委托和事件重点">25 委托和事件【重点】</h2>
<h2 id="26-泛型泛型约束重点">26 泛型,泛型约束【重点】</h2>
<h2 id="27-什么是微服务重点">27 什么是微服务【重点】</h2>
<h2 id="28-微服务的分布式事务重点">28 微服务的分布式事务【重点】</h2>
<h2 id="29-在微服务中什么是一阶段提交两阶段提交三阶段提交">29 在微服务中什么是一阶段提交,两阶段提交,三阶段提交?</h2>
<h3 id="微服务中的分布式事务管理">微服务中的分布式事务管理</h3>
<h2 id="30-微服务的追踪怎么实现有哪些开源组件可以用重点">30 微服务的追踪怎么实现?有哪些开源组件可以用【重点】</h2>
<h2 id="31-多线程async和await异步的实现原理状态机重点">31 多线程,async和await异步的实现原理,状态机【重点】</h2>
<h3 id="多线程的实现原理">多线程的实现原理</h3>
<h3 id="async和await异步的实现原理">async和await异步的实现原理</h3>
<h2 id="32-ddd领域驱动设计重点">32 DDD领域驱动设计【重点】</h2>
<h2 id="33-应用服务和领域服务有什么区别重点">33 应用服务和领域服务有什么区别?【重点】</h2>
<h2 id="34-什么是聚合根和聚合重点">34 什么是聚合根和聚合【重点】</h2>
<h2 id="35-redis缓存穿透-缓存雪崩">35 redis缓存穿透, 缓存雪崩?</h2>
<p>如果本文介绍对你有帮助,可以一键四连:点赞+评论+收藏+推荐,谢谢!</p><br><br>
来源:https://www.cnblogs.com/chenshibao/p/18628476
頁:
[1]