C#面试内容

265 阅读5分钟

以下是C#面试中常见的技术内容分类及典型问题示例,涵盖基础知识、高级特性、框架应用及实际开发场景:


一、C# 语言基础

  1. 语法与核心概念

    • 值类型与引用类型的区别(栈 vs 堆内存分配)。
    • 装箱(Boxing)与拆箱(Unboxing)的性能影响。
    • string 类型的特点(不可变性、StringBuilder 的作用)。
    • 关键字:refoutparamsreadonlyconst 的区别。
    • 运算符重载的实现方式。
  2. 面向对象编程(OOP)

    • 类与结构体的区别(内存分配、继承性等)。
    • 继承、多态的实现(虚方法 virtual、抽象类 abstract、接口 interface)。
    • 封装性的体现(访问修饰符:publicprivateprotectedinternal)。
    • 构造函数链(this() 调用)和静态构造函数。
    • 接口与抽象类的适用场景。
  3. 异常处理

    • try-catch-finally 的执行流程。
    • 自定义异常类的实现(继承 Exception)。
    • throwthrow ex 的区别(是否保留原始堆栈信息)。
  4. 集合与泛型

    • 常见集合类型:List<T>Dictionary<TKey, TValue>HashSet<T> 的特性与性能。
    • 迭代器(IEnumerableyield return)的实现。
    • 协变与逆变(inout 泛型修饰符)。

二、C# 高级特性

  1. 委托与事件

    • 委托(Delegate)的定义与使用(ActionFunc 预定义委托)。
    • 事件(Event)与委托的关系,事件的关键字 event 的作用。
    • 匿名方法与 Lambda 表达式。
    • 观察者模式的实际应用(如事件驱动的UI交互)。
  2. 多线程与异步编程

    • ThreadThreadPoolTask 的区别与使用场景。
    • async/await 的工作原理(状态机、上下文切换)。
    • 线程同步机制(lockMonitorMutexSemaphore)。
    • 死锁的成因与避免方法。
  3. LINQ(Language Integrated Query)

    • 查询语法与方法语法的区别(如 from...where...select vs Where()/Select())。
    • 延迟执行(Deferred Execution)与立即执行(如 ToList() 触发查询)。
    • IQueryableIEnumerable 的区别(数据库查询优化)。
  4. 反射与动态编程

    • 反射(Reflection)的作用(获取类型信息、动态创建对象)。
    • dynamic 关键字的使用场景与性能影响。
    • 特性(Attribute)的定义与应用(如序列化标记 [Serializable])。
  5. 内存管理

    • 垃圾回收(GC)机制(分代回收、GC.Collect() 的谨慎使用)。
    • 析构函数(Finalizer)与 IDisposable 接口(using 语句的作用)。
    • 内存泄漏的常见原因(如事件未取消订阅、静态引用)。

三、.NET 框架与生态

  1. ASP.NET Core

    • 中间件(Middleware)的作用与自定义实现。
    • 依赖注入(DI)的生命周期(Transient、Scoped、Singleton)。
    • Web API 的路由配置(特性路由 vs 约定路由)。
    • 身份认证与授权(JWT、OAuth2、Policy-based Authorization)。
    • 配置管理(appsettings.json、环境变量、密钥管理)。
  2. Entity Framework Core

    • Code First 与 Database First 的区别。
    • 延迟加载(Lazy Loading)与显式加载(Explicit Loading)。
    • 事务管理(DbContext.SaveChanges() 的原子性)。
    • 性能优化(AsNoTracking、查询调优)。
  3. 桌面开发(WPF/WinForms)

    • WPF 的数据绑定(Binding)与 MVVM 模式。
    • XAML 的依赖属性(Dependency Property)与路由事件。
    • WinForms 中控件的事件处理机制。
  4. 其他框架

    • .NET MAUI 的跨平台开发特性。
    • Unity 游戏引擎中的 C# 应用(协程、物理引擎交互)。

四、数据库与ORM

  1. SQL 基础

    • 联合查询(JOIN)、子查询、窗口函数。
    • 索引的作用与优化(聚集索引 vs 非聚集索引)。
    • 事务的 ACID 特性。
  2. Entity Framework

    • LINQ to SQL 的转换过程(如何避免 SELECT N+1 问题)。
    • 迁移(Migration)的使用与回滚。
    • 并发控制(乐观并发、时间戳字段)。

五、设计模式与架构

  1. 常见设计模式

    • 单例模式(线程安全实现)。
    • 工厂模式(简单工厂、抽象工厂)。
    • 观察者模式(事件与委托的实现)。
    • 依赖注入与控制反转(IoC 容器)。
  2. 架构设计

    • 分层架构(UI层、业务逻辑层、数据访问层)。
    • 微服务架构中的服务通信(gRPC、REST API)。
    • 领域驱动设计(DDD)的核心概念(实体、值对象、聚合根)。

六、调试与工具

  1. 开发工具

    • Visual Studio 调试技巧(断点条件、内存分析)。
    • NuGet 包管理(版本冲突解决)。
    • Postman 或 Swagger 的 API 测试。
  2. 性能优化

    • 使用性能分析工具(dotTrace、Visual Studio Profiler)。
    • 减少 GC 压力的方法(对象池、结构体替代类)。

七、算法与编码题

  1. 手写代码

    • 实现冒泡排序、快速排序。
    • 链表反转、二叉树遍历(递归与非递归)。
    • 斐波那契数列(递归与迭代优化)。
    • 判断质数、字符串反转。
  2. 实际问题

    • 多线程下共享资源的线程安全访问。
    • 使用 LINQ 解决复杂数据查询问题。
    • 设计一个缓存机制(LRU 缓存实现)。

八、跨平台与前沿技术

  1. .NET 6/7/8 新特性

    • 顶级语句(Top-level Statements)。
    • 记录类型(Record)的不可变性。
    • 源代码生成器(Source Generators)。
  2. 跨平台开发

    • 使用 .NET MAUI 开发移动应用。
    • 在 Linux 上部署 .NET Core 应用。

九、面试开放性问题

  1. 项目经验

    • 描述一个你解决过的复杂技术问题。
    • 如何设计一个高并发的订单系统?
  2. 技术决策

    • 为什么选择 Entity Framework 而不是 Dapper?
    • 微服务与单体架构的权衡依据。
  3. 学习与成长

    • 最近关注的 .NET 技术趋势是什么?
    • 如何优化一个慢查询的数据库操作?

十、综合考察点

  • 代码规范:命名约定、注释习惯。
  • 单元测试:使用 xUnit/NUnit 编写测试用例。
  • 版本控制:Git 的合并策略(Rebase vs Merge)。
  • 安全意识:SQL 注入防御(参数化查询)、XSS 防护。

准备建议:

  1. 理解底层原理:如值类型/引用类型的内存分配、GC 工作机制。
  2. 框架熟练度:ASP.NET Core 和 EF Core 是重点。
  3. 实际编码能力:多练习 LeetCode 或 Codewars 上的算法题。
  4. 项目经验梳理:清晰描述技术选型、难点及解决方案。