C# & .NET 面试深度复习指南

一、 C# 语言基础 (绝对核心)

  1. 类型系统 (Type System)

    • 值类型 vs 引用类型: 栈 vs 堆分配、赋值语义(拷贝 vs 引用拷贝)、性能考量、装箱(boxing)/拆箱(unboxing)及其性能损耗。
    • 内置类型: int, float, double, decimal, bool, char, string (特殊性:不可变性、驻留池), object (所有类型基类)。
    • 类型转换:
      • 隐式转换 (安全,小范围->大范围)
      • 显式转换/强制转换 (可能丢失精度或运行时异常)
      • as 操作符 (安全转换,失败返回 null,仅用于引用类型和可空值类型)
      • is 操作符 (类型检查)
      • Convert 类, Parse/TryParse 方法 (字符串转换)
    • 可空值类型 (Nullable<T>): T? 语法、HasValueValue、空合并操作符 (??, ??=)。
  2. 变量与作用域 (Variables & Scope)

    • 局部变量、字段(实例/静态)、参数(ref, out, in, params)。
    • 作用域规则 (块级、类级)。
    • 常量 (const) vs 只读字段 (readonly)。
  3. 运算符 (Operators)

    • 算术、关系、逻辑、位、赋值、条件(?:)、???. (null 条件访问)、?[] (null 条件索引)。
    • 运算符重载 (operator 关键字)。
  4. 控制流 (Control Flow)

    • if/else, switch (传统和基于表达式的 switch 表达式), while, do/while, for, foreach
    • break, continue, goto (慎用)。
  5. 异常处理 (Exception Handling)

    • try/catch/finally 块。
    • 异常类型层次 (System.Exception 基类,常用派生类如 ArgumentNullException, InvalidOperationException, IndexOutOfRangeException 等)。
    • 抛出异常 (throw 语句)。
    • 自定义异常类 (继承 Exception 或合适的派生类)。
    • 最佳实践:捕获特定异常、避免捕获一般 Exception (除非顶层)、清理资源用 finallyusing 语句、异常信息应清晰有用。
  6. 面向对象编程 (OOP) - 核心支柱

    • 封装 (Encapsulation):
      • 访问修饰符:public, private, protected, internal, protected internal, private protected
      • 属性 (get/set/init 访问器)、自动属性、计算属性。
      • 索引器 (this[])。
    • 继承 (Inheritance):
      • class Derived : Base
      • 方法重写 (override 关键字)、virtual 方法、abstract 方法和类。
      • sealed 类和成员 (防止继承或重写)。
      • 基类构造函数调用 (base())。
      • 继承 vs 组合 (优先使用组合)。
    • 多态 (Polymorphism):
      • 通过继承和方法重写实现。
      • 通过接口实现。
      • 编译时多态 (方法重载 - overload) vs 运行时多态 (方法重写 - override)。
    • 抽象 (Abstraction):
      • 抽象类 (abstract class):包含抽象成员和实现成员,不能实例化。
      • 接口 (interface):定义契约,只包含方法、属性、事件、索引器的签名 (不含实现,C# 8.0+ 可以有默认实现)。一个类可以实现多个接口。
  7. 类与结构体 (Class vs Struct)

    • 类 (Class): 引用类型、支持继承、可以有析构函数、默认传递引用。
    • 结构体 (Struct): 值类型、隐式 sealed、不能继承也不能被继承、不能有无参构造函数(编译器隐式提供)、字段不能在声明时初始化(除了 conststatic)、适合小型轻量不可变数据。
    • 选择依据:语义(是"值"还是"对象")、大小、是否需装箱、是否需要多态/继承。

二、 C# 进阶特性

  1. 委托 (Delegates) 与 事件 (Events)

    • 委托: 类型安全的函数指针。delegate 关键字定义签名。Action/Func/Predicate 内置泛型委托。
    • 匿名方法 / Lambda 表达式: (parameters) => expression-or-statement-block。闭包 (捕获外部变量)。
    • 事件: 基于委托的发布-订阅模型。event 关键字封装委托,提供 add/remove 访问器。标准模式:EventHandler 委托和 EventArgs 派生类。
  2. 泛型 (Generics)

    • 类型参数化 (<T>),提高代码复用性、类型安全性和性能(避免装箱)。
    • 泛型类、泛型接口、泛型方法、泛型委托。
    • 约束 (where T : constraint): class, struct, new(), 基类名, 接口名。
    • 协变(out T)/逆变(in T) (主要用于接口和委托)。
  3. 集合 (Collections) - 极其重要

    • System.Collections.Generic 命名空间:
      • List<T>:动态数组。随机访问快(O(1)),插入/删除中间元素慢(O(n))。
      • Dictionary<TKey, TValue>:基于哈希表的键值对。查找/插入/删除平均O(1),依赖好的哈希函数。键唯一。
      • HashSet<T>:不重复元素的集合,基于哈希。快速查找、插入、删除(O(1))。无序。
      • Queue<T>:先进先出(FIFO)。
      • Stack<T>:后进先出(LIFO)。
      • LinkedList<T>:双向链表。插入/删除节点快(O(1)),随机访问慢(O(n))。
      • SortedList<TKey, TValue> / SortedDictionary<TKey, TValue>:有序键值对 (基于二叉搜索树)。插入/删除/查找O(log n)。
      • IEnumerable<T> / IEnumerator<T>:迭代器模式的核心接口。
    • 选择依据: 访问模式(随机/顺序)、插入/删除位置、是否需要键、是否需要排序、是否需要唯一性、性能要求。
    • 线程安全集合: ConcurrentDictionary<TKey, TValue>, ConcurrentQueue<T>, ConcurrentStack<T>, ConcurrentBag<T>, BlockingCollection<T>
  4. 语言集成查询 (LINQ)

    • 统一的查询语法,操作对象集合(LINQ to Objects)、数据库(LINQ to Entities)、XML(LINQ to XML)等。
    • 查询语法 (Query Syntax): 类似SQL的 from ... where ... select ...
    • 方法语法 (Method Syntax): 基于扩展方法 (Where(), Select(), OrderBy(), GroupBy(), Join(), Aggregate(), First(), Single(), ToList() 等)。
    • 延迟执行 (Deferred Execution): 查询在迭代结果时才真正执行。IEnumerable<T> 返回。
    • 立即执行 (Immediate Execution): 使用聚合函数(Count(), Max(), Average())或转换(ToList(), ToArray(), ToDictionary())触发执行。
    • Lambda 表达式: 作为查询操作符的谓词或选择器。
    • 理解表达式树 (Expression<TDelegate>): LINQ to SQL/Entities 将查询转换为底层查询语言(如SQL)的关键。
  5. 异步编程 (Async/Await) - 现代开发核心

    • async/await 关键字: 简化异步代码编写,使其看起来像同步代码。
    • TaskTask<T>: 表示异步操作。核心类型。
    • Task.Run: 将 CPU 密集型工作卸载到线程池。
    • Task.WhenAll / Task.WhenAny: 组合多个任务。
    • 避免 async void (除事件处理器外): 异常难以捕获。
    • 配置上下文 (ConfigureAwait(false)): 避免不必要的上下文切换(尤其在库代码中)。
    • 取消 (CancellationToken): 支持协作式取消。
    • 与同步代码的互操作 (Task.Wait() / Task.Result): 慎用!可能导致死锁(特别是在 UI 线程或 ASP.NET Core 请求上下文中)。
  6. 反射 (Reflection) 与 特性 (Attributes)

    • 特性 (Attributes): 为代码元素添加元数据。[AttributeUsage] 定义特性使用范围。常见内置特性:[Obsolete], [Serializable], [DllImport], [Conditional]
    • 反射 (Reflection): System.Reflection 命名空间。在运行时动态检查类型(Type)、创建对象(Activator.CreateInstance)、调用方法(MethodInfo.Invoke)、访问字段/属性。用途:序列化/反序列化、依赖注入容器、ORM、动态代理等。性能开销大,需谨慎使用。
  7. 内存管理 (Memory Management)

    • 垃圾回收 (GC): .NET CLR 的核心机制。自动管理托管堆内存。
      • 分代机制 (Generation 0, 1, 2)。
      • 触发条件:分配时第0代满、系统内存不足、显式调用 GC.Collect() (通常避免)。
      • Finalizer (~ClassName()): 非确定性清理。由GC调用。通常应使用 IDisposable 模式替代。
    • IDisposable 模式:
      • 用于显式释放非托管资源 (文件句柄、数据库连接、网络套接字等)。
      • Dispose() 方法:手动调用释放资源。
      • using 语句 (using (var r = new Resource()) { ... }): 确保 Dispose() 在离开作用域时被调用。
      • 标准实现模式 (包含受保护的 virtual void Dispose(bool disposing) 方法)。
  8. 新版本重要特性 (C# 7.0+)

    • 模式匹配 (Pattern Matching): is 表达式增强、switch 表达式、递归模式 ({ Prop: pattern })。
    • 元组 (Tuples): (int, string) tuple = (1, "a"); 轻量级数据结构。ValueTuple
    • 解构 (Deconstruction): (var x, var y) = tuple;
    • 记录类型 (Record Types - C# 9+): record Person(string Name, int Age); 主要用于不可变数据模型。值相等性、with 表达式。
    • 顶级语句 (Top-level Statements - C# 9+): 简化控制台程序入口点。
    • 可空引用类型 (Nullable Reference Types - C# 8+): string? 表示可为 null 的字符串引用。编译器静态流分析,减少 NullReferenceException
    • 默认接口方法 (Default Interface Methods - C# 8+): 允许接口包含带有默认实现的方法。
    • 文件作用域命名空间 (File-scoped Namespaces - C# 10+): namespace MyNamespace;
    • 全局 using (Global Usings - C# 10+): global using System;
    • 原始字符串字面量 (Raw String Literals - C# 11+): """ ... """
    • 必需成员 (Required Members - C# 11+): required 修饰符强制调用者在对象初始化时必须赋值。
    • 泛型数学 (Generic Math - C# 11+): INumber<T> 等接口。
    • 主构造函数 (Primary Constructors - C# 12+): class Person(string name) { ... }

三、 .NET Framework / .NET Core / .NET 5+ 平台基础

  1. .NET 生态系统: .NET Framework (传统 Windows), .NET Core (跨平台), .NET 5/6/7/8 (统一平台)。
  2. 公共语言运行时 (CLR - Common Language Runtime): 执行引擎。负责内存管理(GC)、异常处理、线程管理、JIT编译(IL->机器码)、安全性。
  3. 中间语言 (IL - Intermediate Language / CIL / MSIL): 所有.NET语言编译成的通用字节码。
  4. 基类库 (BCL - Base Class Library): System.* 命名空间下的大量基础类库 (集合、IO、网络、字符串处理、数学、日期时间等)。
  5. 程序集 (Assembly): .dll.exe 文件。包含 IL 代码、元数据(类型信息)、清单(程序集信息、依赖)。
  6. 应用程序模型:
    • ASP.NET Core: 现代 Web 框架 (MVC, Web API, Razor Pages, Blazor, SignalR)。理解中间件管道(Middleware Pipeline)、依赖注入(DI)、配置(Configuration)、日志(Logging)、路由(Routing)、模型绑定(Model Binding)、过滤器(Filters)、身份验证/授权(Authentication/Authorization)。
    • Windows Forms / WPF: 传统/现代 Windows 桌面 UI 框架 (了解即可,除非面相关岗位)。
    • 控制台应用 (Console App): 基础。
    • 类库 (Class Library): 可重用代码单元。
    • 单元测试项目 (xUnit, NUnit, MSTest): 测试驱动开发(TDD)。
  7. 依赖注入 (DI - Dependency Injection)
    • 控制反转(IoC)的一种实现方式。
    • 核心概念:服务(Service)、服务容器(Container)、服务生命周期(Transient, Scoped, Singleton)、构造函数注入(Constructor Injection)。
    • .NET 内置 Microsoft.Extensions.DependencyInjection
    • 优势:解耦、可测试性、可维护性。

四、 数据库访问 (常考)

  1. ADO.NET: 基础数据访问技术 (SqlConnection, SqlCommand, SqlDataReader, SqlDataAdapter, DataSet)。理解连接池。
  2. 对象关系映射 (ORM):
    • Entity Framework (EF) Core: 主流 ORM。理解 DbContext, DbSet<T>, 迁移(Migrations), LINQ to Entities 查询, 变更跟踪(Change Tracking), 加载策略(延迟加载、显式加载、预先加载 - Eager Loading), 配置(Data Annotations, Fluent API), 原始 SQL 查询(FromSqlRaw/ExecuteSqlRaw), 性能考量(N+1 查询问题)。
  3. Dapper: 轻量级 Micro-ORM。高性能,接近原生 SQL。

五、 设计模式与原则 (体现代码设计能力)

  1. SOLID 原则:
    • S - 单一职责原则 (Single Responsibility Principle)
    • O - 开闭原则 (Open/Closed Principle)
    • L - 里氏替换原则 (Liskov Substitution Principle)
    • I - 接口隔离原则 (Interface Segregation Principle)
    • D - 依赖倒置原则 (Dependency Inversion Principle)
  2. 常用设计模式:
    • 创建型: 工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例(Singleton - 注意线程安全)、建造者(Builder)。
    • 结构型: 适配器(Adapter)、装饰器(Decorator)、代理(Proxy)、组合(Composite)。
    • 行为型: 策略(Strategy)、观察者(Observer - 事件/委托是其实现)、命令(Command)、模板方法(Template Method)、状态(State)、职责链(Chain of Responsibility)。

六、 性能优化 (展示深度)

  1. 分析工具: Visual Studio Profiler, dotTrace, dotMemory, PerfView。
  2. 常见优化点:
    • 避免不必要的装箱/拆箱。
    • 字符串操作:使用 StringBuilder 进行大量拼接。
    • 集合选择:根据场景选择最合适的集合类型。预分配容量(List.Capacity)。
    • 异步 I/O:利用 async/await 避免阻塞线程。
    • 缓存:合理使用内存缓存(MemoryCache)或分布式缓存(Redis)。
    • 数据库访问:优化查询(避免 SELECT *,使用索引),减少往返次数,使用批处理。
    • 对象池化:对创建成本高的对象(如数据库连接,但连接池已内置)。
    • struct vs class: 小对象、频繁创建/销毁、值语义考虑用 struct
    • 反射:避免在热点路径频繁使用反射。考虑使用表达式树编译委托或源代码生成(AOT编译友好)。
    • 垃圾回收:减少大对象分配(LOH - Large Object Heap),避免不必要的对象存活期过长(晋升到 Gen2)。
    • 并行处理:Parallel.For/Parallel.ForEach, Task.WhenAll。注意线程安全。

七、 测试 (展示工程素养)

  1. 单元测试 (Unit Testing): 使用 xUnit/NUnit/MSTest。隔离被测单元(使用 Mocking 框架如 Moq, NSubstitute)。测试行为而非实现细节。遵循 Arrange-Act-Assert (AAA) 模式。
  2. 集成测试 (Integration Testing): 测试多个组件协同工作(如数据库访问、Web API 端点)。
  3. Mocking 框架 (Moq 等): 创建依赖项的替身,控制行为,验证交互。

八、 版本控制 (必备)

  • Git: 熟练使用 git clone, add, commit, push, pull, branch, checkout, merge, rebase, stash, log, diff。理解工作区、暂存区、本地仓库、远程仓库。理解常见工作流(Git Flow, GitHub Flow)。

九、 面试准备技巧

  1. 理解问题: 确认清楚面试官的问题,不要急于回答。
  2. 清晰表达: 用结构化语言解释概念 (是什么、为什么、怎么做、优缺点、适用场景)。
  3. 结合实际: 尽量用你做过的项目中的例子来说明概念。
  4. 手写代码:
    • 练习在白板/纸上写整洁、格式化的代码。
    • 注意命名规范、异常处理、边界条件检查。
    • 常见题目:反转字符串/链表、查找算法(二分查找)、数据结构实现(链表、栈、队列)、设计类(遵循OOP原则)、LINQ查询、简单的异步代码。
  5. 提问环节: 准备有深度的问题询问公司和团队(技术栈、项目挑战、团队文化)。
  6. 保持诚实: 不会的问题坦诚说明,但可以尝试谈谈你的理解或思路。展示学习能力。

十、 .NET 8 亮点 (加分项)

  • 原生 AOT (Native AOT): 发布完全原生可执行文件,启动快、内存占用小(适合云原生、容器)。
  • 性能提升: 持续优化 GC、JIT、容器支持、JSON序列化(System.Text.Json)等。
  • Blazor Full-stack: 统一全栈 Web 开发模型(Blazor Server + Blazor WebAssembly)。
  • AI 集成: .NET Aspire (云原生应用模板)、Azure.AI.OpenAI 包简化 OpenAI 集成。
  • C# 12 特性: 主构造函数、集合表达式([])、Lambda 表达式参数默认值等。

相关推荐
wangnaisheng12 分钟前
【C#】GraphicsPath的用法
c#·gdi
_一条咸鱼_5 小时前
Android Runtime直接内存管理原理深度剖析(73)
android·面试·android jetpack
bianguanyue6 小时前
SQLite密码修改故障排查:RSA加密随机性导致的数据库匹配问题
数据库·sqlite·c#
R-sz6 小时前
导出word并且插入图片
开发语言·c#·word
没有bug.的程序员9 小时前
JAVA面试宝典 -《安全攻防:从 SQL 注入到 JWT 鉴权》
java·安全·面试
熬了夜的程序员11 小时前
【华为机试】HJ61 放苹果
算法·华为·面试·golang
CodeCraft Studio11 小时前
PPT处理控件Aspose.Slides教程:使用 C# 将 PPTX 转换为 EMF
c#·powerpoint·ppt·aspose·ppt格式转换
倔强青铜三12 小时前
苦练Python第15天:Lambda函数——Python的匿名一行杀器
人工智能·python·面试
倔强青铜三12 小时前
苦练Python第14天:Python函数中的*args与**kwargs解析
人工智能·python·面试
future141212 小时前
游戏开发日记7.12
数据结构·学习·c#·游戏开发