高频考点解析

值类型与引用类型

在C#中,值类型(如int、struct、enum)直接存储数据,分配在栈上;引用类型(如class、interface、delegate)存储数据引用,数据实际分配在堆上。面试中常问两者区别及装箱拆箱机制。值类型继承自System.ValueType,而引用类型继承自System.Object。

int a = 10; // 值类型,栈上 string b = "hello"; // 引用类型,堆上

接口与抽象类

接口定义契约,抽象类提供部分实现。接口支持多继承,抽象类只能单继承。C# 8.0后接口支持默认实现,但面试仍常考传统区别:接口无状态,抽象类可有字段;接口方法默认public,抽象类可任意访问修饰符。

泛型约束

泛型约束用于限制类型参数,包括where T:class、where T:new()、where T:struct等。面试常考约束对性能的影响及编译器检查机制。合理使用约束可提升类型安全性和代码复用性。

垃圾回收机制

.NET GC采用分代回收机制(Gen0、Gen1、Gen2)。Gen0存储短生命周期对象,回收频繁;Gen2存储长生命周期对象,回收代价大。面试常问GC触发条件、强制回收GC.Collect()的影响及内存泄漏排查技巧。

// 模拟内存泄漏:静态集合持续增长 private static List<string> _cache = new List<string>(); public void AddItem(string item) { _cache.Add(item); // 永不释放 }

栈与堆的区别

栈存储局部变量和值类型数据,分配释放快;堆存储引用类型对象,由GC管理。面试常考两者性能差异、线程私有性(栈线程私有,堆共享)及内存布局。

IDisposable模式

实现IDisposable接口用于释放非托管资源。面试常考Dispose与Finalizer区别、using语句工作原理及双重释放问题。正确使用可避免内存泄漏和资源耗尽。

async/await机制

async/await基于状态机实现,非阻塞线程。面试常考State Machine原理、SynchronizationContext在UI线程中的作用及ConfigureAwait(false)的使用场景。理解其底层机制是高级.NET开发的必备技能。

public async Task<string> GetDataAsync() { var result = await HttpClient.GetStringAsync(url); return result; }

Task与Thread区别

Task是高级抽象,基于线程池;Thread是操作系统级线程。面试常考Task调度机制、线程池大小配置及Task.WhenAll并行处理。现代开发推荐优先使用Task。

死锁与避免

异步编程中常见死锁场景:UI线程同步等待异步结果。面试常考Lock与Mutex区别、异步死锁原因及ConfigureAwait解决方案。理解上下文捕获机制是关键。

LINQ执行机制

LINQ采用延迟执行,实际执行在遍历时。面试常考Deferred Execution原理、ToList()与AsEnumerable()区别及表达式树编译机制。理解延迟执行可优化性能。

集合类对比

List、LinkedList、Dictionary性能差异明显。面试常考哈希表冲突解决、扩容机制及线程安全集合ConcurrentDictionary使用场景。根据数据量选择合适集合。

迭代器模式

yield return实现迭代器,自动创建状态机。面试常考yield原理、迭代器缓存问题及LINQ底层实现。合理使用可简化代码并提升可读性。

.NET Core架构深度解析

依赖注入容器

.NET Core内置DI容器支持三种生命周期:Transient(每次注入新建)、Scoped(同一请求内共享)、Singleton(全局唯一)。面试常考生命周期选择、循环依赖解决及第三方容器集成。理解DI是构建可测试应用的基础。

// 注册服务 services.AddScoped<IUserService, UserService>(); services.AddSingleton<ILogger, Logger>();

中间件管道

ASP.NET Core中间件按注册顺序执行,形成管道。面试常考中间件执行顺序、自定义中间件写法及异常处理中间件使用。UseMiddleware扩展方法简化了中间件开发。

配置文件系统

.NET Core使用IConfiguration接口支持JSON、环境变量、命令行等多源配置。面试常考配置重载、密钥管理及配置绑定机制。理解配置优先级可避免意外覆盖。

面试准备时间轴

第1周:基础巩固

C#语言核心特性

重点复习泛型、委托、事件、LINQ、异步编程等核心特性。建议通过LeetCode C#版题目巩固基础算法与数据结构,同时整理常见面试题笔记。推荐使用《C#高级编程》作为参考书籍。

第2周:框架深入

.NET Core与ASP.NET MVC

深入学习依赖注入、中间件、配置系统、日志系统等核心机制。动手搭建小型项目,实践RESTful API设计。理解MVC生命周期、路由机制及过滤器使用场景。

第3周:数据库与ORM

Entity Framework Core

掌握EF Core的Code First、Database First模式,理解Change Tracking、延迟加载、显式加载等机制。学习性能优化技巧:AsNoTracking、投影查询、原生SQL执行等。

第4周:架构与实战

微服务与分布式

了解微服务架构模式、服务发现、API网关、熔断器等概念。实践Docker容器化部署,理解Kubernetes基本概念。准备系统设计面试题,如缓存策略、消息队列使用场景。

技术栈对比分析

技术特性 .NET Framework .NET Core 3.1 .NET 5/6/7+
跨平台支持 仅Windows Windows/Linux/macOS 全平台支持
性能表现 中等 高性能 极致优化
部署方式 依赖运行时 独立部署/框架依赖 单文件部署
生命周期 维护模式 LTS支持 活跃开发
云原生支持 有限 良好 原生支持

架构设计面试要点

分层架构

经典三层架构(UI/BLL/DAL)仍是面试基础考点。现代开发推荐整洁架构(Clean Architecture)或洋葱架构,强调依赖倒置。面试常考各层职责划分、接口抽象及测试策略。理解依赖关系是构建可维护系统的关键。

设计模式应用

常见模式:单例、工厂、策略、观察者、装饰器等。面试常考模式适用场景、代码示例及在.NET框架中的体现。如IHttpClientFactory使用策略模式,Middleware使用装饰器模式。结合实际项目经验回答更佳。

分布式事务

微服务架构下分布式事务是难点。面试常考Saga模式、TCC、消息最终一致性等方案。理解CAP定理、BASE理论及两阶段提交局限性。实践推荐使用Outbox模式保证消息可靠性。

数据库相关高频题

索引优化

聚集索引与非聚集索引区别、覆盖索引、索引失效场景。面试常考执行计划分析、慢查询优化及分库分表策略。理解B+树结构及哈希索引适用场景。

-- 创建覆盖索引 CREATE INDEX IX_Orders_CustomerId_Status ON Orders (CustomerId, Status) INCLUDE (OrderDate, TotalAmount);

事务隔离级别

Read Uncommitted、Read Committed、Repeatable Read、Serializable及Snapshot。面试常考脏读、幻读、不可重复读现象及SQL Server默认级别。理解MVCC机制及锁粒度对性能的影响。

存储过程 vs ORM

存储过程性能优势但可维护性差,ORM开发效率高但可能产生低效SQL。面试常考两者适用场景、混合使用策略及SQL注入防范。现代架构倾向于使用ORM+参数化查询。