一、 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 *
,使用索引),减少往返次数,使用批处理。 - 对象池化:对创建成本高的对象(如数据库连接,但连接池已内置)。
struct
vsclass
: 小对象、频繁创建/销毁、值语义考虑用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 表达式参数默认值等。