以下是C#面试中常见的技术内容分类及典型问题示例,涵盖基础知识、高级特性、框架应用及实际开发场景:
一、C# 语言基础
-
语法与核心概念
- 值类型与引用类型的区别(栈 vs 堆内存分配)。
- 装箱(Boxing)与拆箱(Unboxing)的性能影响。
string类型的特点(不可变性、StringBuilder的作用)。- 关键字:
ref、out、params、readonly、const的区别。 - 运算符重载的实现方式。
-
面向对象编程(OOP)
- 类与结构体的区别(内存分配、继承性等)。
- 继承、多态的实现(虚方法
virtual、抽象类abstract、接口interface)。 - 封装性的体现(访问修饰符:
public、private、protected、internal)。 - 构造函数链(
this()调用)和静态构造函数。 - 接口与抽象类的适用场景。
-
异常处理
try-catch-finally的执行流程。- 自定义异常类的实现(继承
Exception)。 throw与throw ex的区别(是否保留原始堆栈信息)。
-
集合与泛型
- 常见集合类型:
List<T>、Dictionary<TKey, TValue>、HashSet<T>的特性与性能。 - 迭代器(
IEnumerable、yield return)的实现。 - 协变与逆变(
in、out泛型修饰符)。
- 常见集合类型:
二、C# 高级特性
-
委托与事件
- 委托(Delegate)的定义与使用(
Action、Func预定义委托)。 - 事件(Event)与委托的关系,事件的关键字
event的作用。 - 匿名方法与 Lambda 表达式。
- 观察者模式的实际应用(如事件驱动的UI交互)。
- 委托(Delegate)的定义与使用(
-
多线程与异步编程
Thread、ThreadPool、Task的区别与使用场景。async/await的工作原理(状态机、上下文切换)。- 线程同步机制(
lock、Monitor、Mutex、Semaphore)。 - 死锁的成因与避免方法。
-
LINQ(Language Integrated Query)
- 查询语法与方法语法的区别(如
from...where...selectvsWhere()/Select())。 - 延迟执行(Deferred Execution)与立即执行(如
ToList()触发查询)。 IQueryable与IEnumerable的区别(数据库查询优化)。
- 查询语法与方法语法的区别(如
-
反射与动态编程
- 反射(Reflection)的作用(获取类型信息、动态创建对象)。
dynamic关键字的使用场景与性能影响。- 特性(Attribute)的定义与应用(如序列化标记
[Serializable])。
-
内存管理
- 垃圾回收(GC)机制(分代回收、
GC.Collect()的谨慎使用)。 - 析构函数(Finalizer)与
IDisposable接口(using语句的作用)。 - 内存泄漏的常见原因(如事件未取消订阅、静态引用)。
- 垃圾回收(GC)机制(分代回收、
三、.NET 框架与生态
-
ASP.NET Core
- 中间件(Middleware)的作用与自定义实现。
- 依赖注入(DI)的生命周期(Transient、Scoped、Singleton)。
- Web API 的路由配置(特性路由 vs 约定路由)。
- 身份认证与授权(JWT、OAuth2、Policy-based Authorization)。
- 配置管理(
appsettings.json、环境变量、密钥管理)。
-
Entity Framework Core
- Code First 与 Database First 的区别。
- 延迟加载(Lazy Loading)与显式加载(Explicit Loading)。
- 事务管理(
DbContext.SaveChanges()的原子性)。 - 性能优化(AsNoTracking、查询调优)。
-
桌面开发(WPF/WinForms)
- WPF 的数据绑定(Binding)与 MVVM 模式。
- XAML 的依赖属性(Dependency Property)与路由事件。
- WinForms 中控件的事件处理机制。
-
其他框架
- .NET MAUI 的跨平台开发特性。
- Unity 游戏引擎中的 C# 应用(协程、物理引擎交互)。
四、数据库与ORM
-
SQL 基础
- 联合查询(JOIN)、子查询、窗口函数。
- 索引的作用与优化(聚集索引 vs 非聚集索引)。
- 事务的 ACID 特性。
-
Entity Framework
- LINQ to SQL 的转换过程(如何避免 SELECT N+1 问题)。
- 迁移(Migration)的使用与回滚。
- 并发控制(乐观并发、时间戳字段)。
五、设计模式与架构
-
常见设计模式
- 单例模式(线程安全实现)。
- 工厂模式(简单工厂、抽象工厂)。
- 观察者模式(事件与委托的实现)。
- 依赖注入与控制反转(IoC 容器)。
-
架构设计
- 分层架构(UI层、业务逻辑层、数据访问层)。
- 微服务架构中的服务通信(gRPC、REST API)。
- 领域驱动设计(DDD)的核心概念(实体、值对象、聚合根)。
六、调试与工具
-
开发工具
- Visual Studio 调试技巧(断点条件、内存分析)。
- NuGet 包管理(版本冲突解决)。
- Postman 或 Swagger 的 API 测试。
-
性能优化
- 使用性能分析工具(dotTrace、Visual Studio Profiler)。
- 减少 GC 压力的方法(对象池、结构体替代类)。
七、算法与编码题
-
手写代码
- 实现冒泡排序、快速排序。
- 链表反转、二叉树遍历(递归与非递归)。
- 斐波那契数列(递归与迭代优化)。
- 判断质数、字符串反转。
-
实际问题
- 多线程下共享资源的线程安全访问。
- 使用 LINQ 解决复杂数据查询问题。
- 设计一个缓存机制(LRU 缓存实现)。
八、跨平台与前沿技术
-
.NET 6/7/8 新特性
- 顶级语句(Top-level Statements)。
- 记录类型(Record)的不可变性。
- 源代码生成器(Source Generators)。
-
跨平台开发
- 使用 .NET MAUI 开发移动应用。
- 在 Linux 上部署 .NET Core 应用。
九、面试开放性问题
-
项目经验
- 描述一个你解决过的复杂技术问题。
- 如何设计一个高并发的订单系统?
-
技术决策
- 为什么选择 Entity Framework 而不是 Dapper?
- 微服务与单体架构的权衡依据。
-
学习与成长
- 最近关注的 .NET 技术趋势是什么?
- 如何优化一个慢查询的数据库操作?
十、综合考察点
- 代码规范:命名约定、注释习惯。
- 单元测试:使用 xUnit/NUnit 编写测试用例。
- 版本控制:Git 的合并策略(Rebase vs Merge)。
- 安全意识:SQL 注入防御(参数化查询)、XSS 防护。
准备建议:
- 理解底层原理:如值类型/引用类型的内存分配、GC 工作机制。
- 框架熟练度:ASP.NET Core 和 EF Core 是重点。
- 实际编码能力:多练习 LeetCode 或 Codewars 上的算法题。
- 项目经验梳理:清晰描述技术选型、难点及解决方案。