






















装箱/拆箱、ref struct、readonly struct 对性能的影响?
答:值类型→引用类型会产生装箱(堆分配)。ref struct 强制栈分配,禁止装箱。
struct与class在内存分配、传参、性能上的差异,什么场景应避免使用大struct?
Span<T> 的作用
- 答案:Span<T> 提供对连续内存的安全访问,不需要复制数据,常用于高性能场景如字符串处理、缓冲区操作。
DI容器的核心原理?三种生命周期(Transient/Scoped/Singleton)的区别与使用场景?如何替换默认DI容器?
中间件的执行顺序?Use与Run的区别?如何实现中间件短路?
await 之后,代码一定在原线程执行吗?
答:取决于 SynchronizationContext。在 ASP.NET Core 中,由于去掉了上下文,await 之后通常由线程池中的任意可用线程继续执行。
在 UI 线程(如 WPF)中,默认会回到原线程。如果不需要回到原线程,应使用 .ConfigureAwait(false) 来避免潜在的死锁并提升性能。
async/await的底层实现是什么?SynchronizationContext在不同场景下的恢复逻辑,为何要避免async void?
答:
.NET Framework 与 .NET(Core)的本质区别?
答:.NET 是跨平台、模块化、AOT 友好;Framework 是 Windows 独占、单体框架。性能上 .NET 10 比 Framework 提升 2-3 倍(JIT 优化 + Native AOT)。
HostBuilder vs WebApplicationBuilder(.NET 6+ Minimal API)区别?
答:WebApplicationBuilder 内置 Kestrel + 默认中间件,简化配置。生产环境仍推荐 HostBuilder 精细控制。
SignalR 与 gRPC 的选择场景?
答:SignalR 适合实时推送(WebSocket fallback);gRPC 适合内部高性能 RPC(HTTP/2 + Protobuf)。
EF Core 与 Dapper 的选择依据?**
答:复杂业务用 EF(LINQ + 迁移);高性能查询用 Dapper(微 ORM)。
DDD、Clean Architecture、Vertical Slice Architecture 的区别?
答:DDD 强调领域模型;Clean 强调依赖倒置;Vertical Slice 按功能切片(一个 Use Case 一个文件),减少抽象地狱,适合微服务。
微服务拆分原则?服务治理如何实现?
答:领域驱动 + 单一职责 + 数据库 per service。服务发现(Consul)、网关(Ocelot/YARP)、熔断(Polly + Resilience)。
EF Core 性能“杀手锏”
非跟踪查询: context.Users.AsNoTracking().ToList(); 绕过状态快照,大幅减少内存开销。
拆分查询(Split Queries):针对一对多关联查询,避免笛卡尔积爆炸:
var blogs = context.Blogs
.Include(b => b.Posts)
.AsSplitQuery() // .NET 5+ 特性
.ToList();
Change Tracking、AsNoTracking、Compiled Queries 的性能对比?
答:默认跟踪适合写操作;AsNoTracking 读操作可提升 30-50%;Compiled Queries(EF 8+)避免每次编译表达式树。
EF Core的ChangeTracker跟踪机制?AsNoTracking、Split Queries的使用场景?批量更新/删除的最佳实践?EF Core核心原理与性能优化
ASP.NET Core大表(百万级)查询超时如何优化?Bulk 操作方案?
答:分页 + 索引 + AsSplitQuery;用 Z.EntityFramework.Plus 或 EFCore.BulkExtensions 批量插入/更新。
安全与认证授权JWT + Refresh Token + OpenId Connect 完整方案?
答:IdentityServer / Duende IdentityServer / Keycloak。短期 Access Token + HttpOnly Refresh Token,结合 Cookie + SameSite。
给定以下存在死锁的代码,指出死锁原因并修复,解释为何GetAwaiter().GetResult()同样有风险。
// 存在死锁的代码
public void DeadlockDemo()
{
// 调用异步方法并同步阻塞
var result = GetDataAsync().Result;
Console.WriteLine(result);
}
public async Task<string> GetDataAsync()
{
// 模拟异步操作
await Task.Delay(100);
return "data";
}
修复方案与解释:
修复方案1(推荐):全链路异步化,避免同步阻塞异步。
public async Task DeadlockDemoAsync()
{
var result = await GetDataAsync();
Console.WriteLine(result);
}
修复方案2(无上下文场景):使用ConfigureAwait(false),避免恢复到原上下文。
public async Task<string> GetDataAsync()
{
await Task.Delay(100).ConfigureAwait(false);
return "data";
}
GetAwaiter().GetResult()的风险:与.Result类似,同样会同步阻塞线程,在有SynchronizationContext的环境中仍会引发死锁,仅适合无上下文场景(如控制台程序)
字符串中出现次数最多的字符
var result = input.GroupBy(c => c)
.OrderByDescending(g => g.Count())
.First();
Console.WriteLine($"{result.Key}: {result.Count()}");
`
生产者-消费者模型
var channel = Channel.CreateUnbounded<int>();
// Producer
await channel.Writer.WriteAsync(1);
// Consumer
var item = await channel.Reader.ReadAsync();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。