一、C#语言特性
-
值类型与引用类型的区别?装箱与拆箱的过程是怎样的?
- 值类型(如
int、struct)存储在栈上,直接包含数据,生命周期由作用域管理。 - 引用类型(如
class、string)存储在堆上,栈中保存引用地址,需通过new创建,生命周期由垃圾回收器(GC)管理。 - 装箱:将值类型转换为引用类型(如
object o = 123;)。 - 拆箱:将引用类型转换回值类型(如
int i = (int)o;)。
- 值类型(如
-
接口与抽象类的异同?如何选择使用?
-
相同点:均无法直接实例化,可包含未实现的方法。
-
不同点:
- 接口支持多继承,抽象类仅支持单继承。
- 接口定义规范(仅有方法签名),抽象类可包含具体实现。
-
选择:需多继承规范时用接口,需共享代码或状态时用抽象类。
-
-
委托与事件在C#中的作用及实现原理?
- 委托:类似函数指针,用于封装方法调用(如
delegate void MyDelegate(string s);)。 - 事件:基于委托,提供发布-订阅模型(如
public event EventHandler MyEvent;)。 - 原理:事件本质是封装了委托的属性,确保外部只能订阅或取消订阅,不能直接触发。
- 委托:类似函数指针,用于封装方法调用(如
-
const与readonly的关键区别及应用场景?const:编译时常量,必须在声明时初始化,值不可变(如const int MAX = 100;)。readonly:运行时常量,可在构造函数中初始化,值不可变(如readonly DateTime _birthDate;)。- 场景:
const用于固定值,readonly用于依赖外部数据的常量。
-
泛型的主要约束和次要约束是什么?举例说明。
- 主要约束:
where T : class(引用类型)、where T : struct(值类型)、where T : new()(有公共无参构造函数)。 - 次要约束:
where T : IComparable(实现接口)、where T : MyClass(继承自特定类)。 - 示例:
public class List<T> where T : IComparable { ... }。
- 主要约束:
二、.NET框架核心
-
CLR(公共语言运行库)的核心功能有哪些?
- 内存管理(自动垃圾回收)。
- 代码执行(编译IL为机器码)。
- 类型安全验证。
- 异常处理与线程管理。
-
BCL(基类库)中常用的命名空间及其作用?
System:基础类型(如String、Int32)。System.Collections.Generic:泛型集合(如List<T>、Dictionary<TKey, TValue>)。System.Linq:LINQ查询操作。System.Threading:多线程与异步编程。
-
解释IL(中间语言)在.NET编译过程中的作用。
- C#代码编译为IL(中间语言),存储在程序集(
.exe/.dll)中。 - CLR在运行时将IL编译为平台特定机器码(JIT编译),实现跨平台兼容性。
- C#代码编译为IL(中间语言),存储在程序集(
-
垃圾回收(GC)机制如何工作?如何优化性能?
- 工作原理:标记-清除算法,分代回收(第0代短期对象,第1/2代长期对象)。
- 优化:避免大对象分配在短期代,手动释放非托管资源(实现
IDisposable)。
-
什么是应用程序域(AppDomain)?其作用是什么?
- 独立的内存空间,用于隔离应用程序。
- 作用:动态加载/卸载程序集,提高安全性与稳定性。
三、ASP.NET Core
-
ASP.NET Core与ASP.NET的主要区别及优势?
- 跨平台:支持Windows、Linux、macOS。
- 模块化:依赖注入内置,中间件管道灵活。
- 性能:基于Kestrel服务器,更高吞吐量。
-
MVC架构在ASP.NET Core中的实现及优势?
-
实现:
- Model:数据与业务逻辑。
- View:用户界面(Razor视图)。
- Controller:处理请求与路由。
-
优势:职责分离,易于测试与维护。
-
-
依赖注入(DI)在ASP.NET Core中的工作原理及优势?
- 原理:在
Startup.cs中注册服务,通过构造函数注入依赖。 - 优势:解耦组件,提高可测试性(支持模拟对象)。
- 原理:在
-
中间件(Middleware)的作用及配置方法?
- 作用:处理HTTP请求与响应(如日志、异常处理)。
- 配置:在
Configure方法中使用app.Use()添加中间件。
-
如何配置ASP.NET Core应用的IP地址和端口号?
-
方式1:修改
Program.cs中的WebApplication配置:csharp var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseUrls("http://*:5000"); -
方式2:通过命令行参数(
dotnet run --urls "http://localhost:5001")。
-
四、数据库访问
-
ADO.NET中的核心对象及其作用?
- Connection:建立数据库连接。
- Command:执行SQL命令或存储过程。
- DataReader:高效读取数据流(只进、只读)。
- DataSet:内存中的数据缓存,支持离线操作。
-
Entity Framework与LINQ to SQL的区别及适用场景?
- EF:支持复杂模型与迁移,适合企业级应用。
- LINQ to SQL:轻量级,适合简单查询。
-
如何防止SQL注入攻击?举例说明。
-
方法:使用参数化查询(如EF的
Parameter.AddWithValue)。 -
示例:
csharp using (var command = new SqlCommand("SELECT * FROM Users WHERE Id = @Id", conn)) { command.Parameters.AddWithValue("@Id", userId); }
-
-
数据库连接池的作用及配置方法?
- 作用:复用数据库连接,减少开销。
- 配置:在连接字符串中设置
Pooling=true; Max Pool Size=100;。
-
什么是延迟执行(Deferred Execution)在LINQ中的体现?
-
定义:查询在枚举时才执行(如
foreach循环)。 -
示例:
csharp var query = db.Users.Where(u => u.Age > 18); // 仅定义查询 foreach (var user in query) { ... } // 此时才执行SQL
-
五、多线程与异步编程
-
线程与进程的区别?Windows单个进程的最大内存限制?
- 线程:进程内的执行单元,共享进程资源。
- 进程:资源分配的最小单位,包含多个线程。
- 内存限制:32位系统为2GB,64位系统为8TB(实际受物理内存限制)。
-
Task与Thread的区别及适用场景?Thread:低级API,需手动管理线程生命周期。Task:高级API,基于线程池,支持异步与取消。- 场景:短期并行任务用
Parallel.For,长期任务用Task.Run。
-
async/await关键字的作用及实现原理?- 作用:简化异步编程,避免阻塞主线程。
- 原理:编译器将方法拆分为状态机,通过
await释放线程,完成时恢复执行。
-
如何处理线程同步问题?锁(Lock)与监视器(Monitor)的区别?
- 锁(
lock) :语法糖,内部使用Monitor.Enter/Exit。 - 监视器(
Monitor) :提供更细粒度控制(如Pulse/Wait)。
- 锁(
-
什么是线程池(ThreadPool)?其优势是什么?
- 定义:预先创建的线程集合,用于执行短期任务。
- 优势:减少线程创建/销毁开销,提高性能。
六、设计模式与架构
-
单例模式、工厂模式、观察者模式在.NET中的实现及应用?
-
单例模式:
csharp public sealed class Singleton { private static readonly Singleton _instance = new Singleton(); private Singleton() { } public static Singleton Instance => _instance; } -
工厂模式:通过方法创建对象(如
Abstract Factory)。 -
观察者模式:事件与委托实现(如
EventHandler)。
-
-
什么是DDD(领域驱动设计)?其核心概念有哪些?
- 定义:以业务领域为核心的设计方法。
- 核心概念:聚合(Aggregate)、仓储(Repository)、领域事件(Domain Event)。
-
微服务架构在.NET中的实现及挑战?
- 实现:使用ASP.NET Core Web API,结合Docker与Kubernetes部署。
- 挑战:分布式事务、服务间通信(如gRPC)、监控与日志。
-
如何设计一个可扩展、高可用的.NET应用架构?
- 分层架构:UI层、应用层、领域层、基础设施层。
- 缓存:使用Redis缓存热点数据。
- 负载均衡:通过Nginx或Azure Load Balancer分发流量。
-
什么是ABP框架?其核心模块及优势?
- 定义:开源的ASP.NET Boilerplate框架,简化企业级应用开发。
- 核心模块:领域层、应用层、UI层、基础设施层。
- 优势:内置权限验证、异常处理、审计日志等功能。
七、其他关键问题
-
字符串处理:
string、StringBuilder的区别及性能优化?string:不可变,频繁修改会生成新对象。StringBuilder:可变,适合高频拼接操作。
-
异常处理:
try/catch/finally的最佳实践及性能考虑?- 实践:捕获特定异常(如
SqlException),避免空catch块。 - 性能:异常处理成本高,应避免在正常流程中使用。
- 实践:捕获特定异常(如
-
序列化与反序列化在.NET中的实现及应用?
- 实现:使用
JsonSerializer(.NET Core 3.0+)或Newtonsoft.Json。 - 应用:Web API通信、配置文件读写。
- 实现:使用
-
什么是强类型(Strong Typing)与弱类型(Weak Typing)?
- 强类型:变量类型在编译时确定(如C#)。
- 弱类型:变量类型可在运行时改变(如JavaScript)。
-
如何部署和配置一个.NET应用?包括IIS和Kestrel的配置差异?
- IIS:通过Web Deploy发布,支持Windows身份验证。
- Kestrel:内置跨平台服务器,需配合反向代理(如Nginx)使用。