一、 C# 语言基础 (绝对核心)
-
类型系统 (Type System)
- 值类型 vs 引用类型: 栈 vs 堆分配、赋值语义(拷贝 vs 引用拷贝)、性能考量、装箱(boxing)/拆箱(unboxing)及其性能损耗。
- 内置类型:
int,float,double,decimal,bool,char,string(特殊性:不可变性、驻留池),object(所有类型基类)。 - 类型转换:
- 隐式转换 (安全,小范围->大范围)
- 显式转换/强制转换 (可能丢失精度或运行时异常)
as操作符 (安全转换,失败返回null,仅用于引用类型和可空值类型)is操作符 (类型检查)Convert类,Parse/TryParse方法 (字符串转换)
- 可空值类型 (
Nullable<T>):T?语法、HasValue、Value、空合并操作符 (??,??=)。
-
变量与作用域 (Variables & Scope)
- 局部变量、字段(实例/静态)、参数(
ref,out,in,params)。 - 作用域规则 (块级、类级)。
- 常量 (
const) vs 只读字段 (readonly)。
- 局部变量、字段(实例/静态)、参数(
-
运算符 (Operators)
- 算术、关系、逻辑、位、赋值、条件(
?:)、??、?.(null 条件访问)、?[](null 条件索引)。 - 运算符重载 (
operator关键字)。
- 算术、关系、逻辑、位、赋值、条件(
-
控制流 (Control Flow)
if/else,switch(传统和基于表达式的switch表达式),while,do/while,for,foreach。break,continue,goto(慎用)。
-
异常处理 (Exception Handling)
try/catch/finally块。- 异常类型层次 (
System.Exception基类,常用派生类如ArgumentNullException,InvalidOperationException,IndexOutOfRangeException等)。 - 抛出异常 (
throw语句)。 - 自定义异常类 (继承
Exception或合适的派生类)。 - 最佳实践:捕获特定异常、避免捕获一般
Exception(除非顶层)、清理资源用finally或using语句、异常信息应清晰有用。
-
面向对象编程 (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+ 可以有默认实现)。一个类可以实现多个接口。
- 抽象类 (
- 封装 (Encapsulation):
-
类与结构体 (Class vs Struct)
- 类 (Class): 引用类型、支持继承、可以有析构函数、默认传递引用。
- 结构体 (Struct): 值类型、隐式
sealed、不能继承也不能被继承、不能有无参构造函数(编译器隐式提供)、字段不能在声明时初始化(除了const或static)、适合小型轻量不可变数据。 - 选择依据:语义(是"值"还是"对象")、大小、是否需装箱、是否需要多态/继承。
二、 C# 进阶特性
-
委托 (Delegates) 与 事件 (Events)
- 委托: 类型安全的函数指针。
delegate关键字定义签名。Action/Func/Predicate内置泛型委托。 - 匿名方法 / Lambda 表达式:
(parameters) => expression-or-statement-block。闭包 (捕获外部变量)。 - 事件: 基于委托的发布-订阅模型。
event关键字封装委托,提供add/remove访问器。标准模式:EventHandler委托和EventArgs派生类。
- 委托: 类型安全的函数指针。
-
泛型 (Generics)
- 类型参数化 (
<T>),提高代码复用性、类型安全性和性能(避免装箱)。 - 泛型类、泛型接口、泛型方法、泛型委托。
- 约束 (
where T : constraint):class,struct,new(), 基类名, 接口名。 - 协变(
out T)/逆变(in T) (主要用于接口和委托)。
- 类型参数化 (
-
集合 (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>。
-
语言集成查询 (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)的关键。
- 统一的查询语法,操作对象集合(
-
异步编程 (Async/Await) - 现代开发核心
async/await关键字: 简化异步代码编写,使其看起来像同步代码。Task和Task<T>: 表示异步操作。核心类型。Task.Run: 将 CPU 密集型工作卸载到线程池。Task.WhenAll/Task.WhenAny: 组合多个任务。- 避免
async void(除事件处理器外): 异常难以捕获。 - 配置上下文 (
ConfigureAwait(false)): 避免不必要的上下文切换(尤其在库代码中)。 - 取消 (
CancellationToken): 支持协作式取消。 - 与同步代码的互操作 (
Task.Wait()/Task.Result): 慎用!可能导致死锁(特别是在 UI 线程或 ASP.NET Core 请求上下文中)。
-
反射 (Reflection) 与 特性 (Attributes)
- 特性 (Attributes): 为代码元素添加元数据。
[AttributeUsage]定义特性使用范围。常见内置特性:[Obsolete],[Serializable],[DllImport],[Conditional]。 - 反射 (Reflection):
System.Reflection命名空间。在运行时动态检查类型(Type)、创建对象(Activator.CreateInstance)、调用方法(MethodInfo.Invoke)、访问字段/属性。用途:序列化/反序列化、依赖注入容器、ORM、动态代理等。性能开销大,需谨慎使用。
- 特性 (Attributes): 为代码元素添加元数据。
-
内存管理 (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)方法)。
- 垃圾回收 (GC): .NET CLR 的核心机制。自动管理托管堆内存。
-
新版本重要特性 (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) { ... }。
- 模式匹配 (Pattern Matching):
三、 .NET Framework / .NET Core / .NET 5+ 平台基础
- .NET 生态系统: .NET Framework (传统 Windows), .NET Core (跨平台), .NET 5/6/7/8 (统一平台)。
- 公共语言运行时 (CLR - Common Language Runtime): 执行引擎。负责内存管理(GC)、异常处理、线程管理、JIT编译(IL->机器码)、安全性。
- 中间语言 (IL - Intermediate Language / CIL / MSIL): 所有.NET语言编译成的通用字节码。
- 基类库 (BCL - Base Class Library):
System.*命名空间下的大量基础类库 (集合、IO、网络、字符串处理、数学、日期时间等)。 - 程序集 (Assembly):
.dll或.exe文件。包含 IL 代码、元数据(类型信息)、清单(程序集信息、依赖)。 - 应用程序模型:
- 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)。
- 依赖注入 (DI - Dependency Injection)
- 控制反转(IoC)的一种实现方式。
- 核心概念:服务(Service)、服务容器(Container)、服务生命周期(Transient, Scoped, Singleton)、构造函数注入(Constructor Injection)。
- .NET 内置
Microsoft.Extensions.DependencyInjection。 - 优势:解耦、可测试性、可维护性。
四、 数据库访问 (常考)
- ADO.NET: 基础数据访问技术 (
SqlConnection,SqlCommand,SqlDataReader,SqlDataAdapter,DataSet)。理解连接池。 - 对象关系映射 (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 查询问题)。
- Entity Framework (EF) Core: 主流 ORM。理解
- Dapper: 轻量级 Micro-ORM。高性能,接近原生 SQL。
五、 设计模式与原则 (体现代码设计能力)
- SOLID 原则:
- S - 单一职责原则 (Single Responsibility Principle)
- O - 开闭原则 (Open/Closed Principle)
- L - 里氏替换原则 (Liskov Substitution Principle)
- I - 接口隔离原则 (Interface Segregation Principle)
- D - 依赖倒置原则 (Dependency Inversion Principle)
- 常用设计模式:
- 创建型: 工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例(Singleton - 注意线程安全)、建造者(Builder)。
- 结构型: 适配器(Adapter)、装饰器(Decorator)、代理(Proxy)、组合(Composite)。
- 行为型: 策略(Strategy)、观察者(Observer - 事件/委托是其实现)、命令(Command)、模板方法(Template Method)、状态(State)、职责链(Chain of Responsibility)。
六、 性能优化 (展示深度)
- 分析工具: Visual Studio Profiler, dotTrace, dotMemory, PerfView。
- 常见优化点:
- 避免不必要的装箱/拆箱。
- 字符串操作:使用
StringBuilder进行大量拼接。 - 集合选择:根据场景选择最合适的集合类型。预分配容量(
List.Capacity)。 - 异步 I/O:利用
async/await避免阻塞线程。 - 缓存:合理使用内存缓存(
MemoryCache)或分布式缓存(Redis)。 - 数据库访问:优化查询(避免
SELECT *,使用索引),减少往返次数,使用批处理。 - 对象池化:对创建成本高的对象(如数据库连接,但连接池已内置)。
structvsclass: 小对象、频繁创建/销毁、值语义考虑用struct。- 反射:避免在热点路径频繁使用反射。考虑使用表达式树编译委托或源代码生成(AOT编译友好)。
- 垃圾回收:减少大对象分配(LOH - Large Object Heap),避免不必要的对象存活期过长(晋升到 Gen2)。
- 并行处理:
Parallel.For/Parallel.ForEach,Task.WhenAll。注意线程安全。
七、 测试 (展示工程素养)
- 单元测试 (Unit Testing): 使用 xUnit/NUnit/MSTest。隔离被测单元(使用 Mocking 框架如 Moq, NSubstitute)。测试行为而非实现细节。遵循 Arrange-Act-Assert (AAA) 模式。
- 集成测试 (Integration Testing): 测试多个组件协同工作(如数据库访问、Web API 端点)。
- Mocking 框架 (Moq 等): 创建依赖项的替身,控制行为,验证交互。
八、 版本控制 (必备)
- Git: 熟练使用
git clone,add,commit,push,pull,branch,checkout,merge,rebase,stash,log,diff。理解工作区、暂存区、本地仓库、远程仓库。理解常见工作流(Git Flow, GitHub Flow)。
九、 面试准备技巧
- 理解问题: 确认清楚面试官的问题,不要急于回答。
- 清晰表达: 用结构化语言解释概念 (是什么、为什么、怎么做、优缺点、适用场景)。
- 结合实际: 尽量用你做过的项目中的例子来说明概念。
- 手写代码:
- 练习在白板/纸上写整洁、格式化的代码。
- 注意命名规范、异常处理、边界条件检查。
- 常见题目:反转字符串/链表、查找算法(二分查找)、数据结构实现(链表、栈、队列)、设计类(遵循OOP原则)、LINQ查询、简单的异步代码。
- 提问环节: 准备有深度的问题询问公司和团队(技术栈、项目挑战、团队文化)。
- 保持诚实: 不会的问题坦诚说明,但可以尝试谈谈你的理解或思路。展示学习能力。
十、 .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 表达式参数默认值等。