C#核心面试题精讲(附实战解析)

📅 2026/7/15 2:47:44
C#核心面试题精讲(附实战解析)
1. 堆与栈值类型与引用类型的底层逻辑先看这段代码int num 42; // 值类型分配在栈上 string name Alice; // 引用类型引用在栈上实际数据在堆上栈就像快餐店的取餐柜存取速度快但空间有限。当方法执行时局部变量会像餐盘一样被快速放入栈中方法结束立即自动清理。值类型如int、struct直接存放在这里这也是为什么struct适合小数据量场景。堆更像自助餐厅的取餐区容量大但管理复杂。引用类型如class、string的实际数据存放在这里栈上只保存取餐号内存地址。比如创建一个对象时Person p new Person(); // new在堆上开辟空间p变量在栈保存引用GC的运作机制堆内存需要垃圾回收器GC定期清理。GC采用分代回收策略新创建对象在Gen 0年轻代回收频率高存活对象晋升到Gen 1中生代长期存活对象进入Gen 2老年代实战建议频繁创建的临时变量尽量用struct栈分配大对象直接进入Gen 2避免频繁GC可用using或手动调用Dispose()及时释放非托管资源2. 委托与事件观察者模式的实现核心委托本质是类型安全的函数指针比如delegate void Logger(string message); // 定义委托类型 class Processor { public Logger OnProcess; // 委托字段 void Run() { OnProcess?.Invoke(Started); // 触发委托 } }事件则是封装后的委托关键区别在于事件只能从声明它的类内部触发外部只能通过/-订阅class Stock { public event Action PriceChanged; // 事件声明 void UpdatePrice() { PriceChanged?.Invoke(); // 类内部触发 } }典型应用场景UI按钮点击事件发布-订阅消息系统异步回调如APM模式避坑指南事件触发前总是检查null?.Invoke()避免内存泄漏及时取消订阅多线程环境下需要同步控制3. 多态实现重写与重载的深度解析**重载Overload**是编译时多态class Calculator { // 方法签名不同 int Add(int a, int b) a b; double Add(double a, double b) a b; }编译器根据参数类型决定调用哪个版本。**重写Override**是运行时多态class Animal { public virtual void Speak() Console.WriteLine(Some sound); } class Dog : Animal { public override void Speak() Console.WriteLine(Bark); } Animal myPet new Dog(); myPet.Speak(); // 输出Bark - 运行时决定关键区别特性重载重写绑定时机编译时运行时方法签名必须不同必须相同作用域同一个类继承体系关键字无virtual/override设计原则优先使用接口而非虚方法使用sealed阻止不需要的继承LSP原则子类应该能替换父类4. 异常处理从基础到最佳实践基础try-catch-finallytry { File.ReadAllText(missing.txt); } catch (FileNotFoundException ex) { Console.WriteLine($文件未找到: {ex.FileName}); } catch (Exception ex) { Console.WriteLine($其他错误: {ex.Message}); } finally { // 无论是否异常都会执行 }异常筛选器C# 6try { ... } catch (HttpRequestException ex) when (ex.StatusCode 404) { // 只捕获404错误 }性能关键点异常处理比正常流程慢1000倍避免用异常处理正常逻辑如用TryParse代替Parse自定义异常应继承Exception并提供序列化支持异步异常处理async Task ProcessAsync() { try { await SomeAsyncOperation(); } catch (CustomException ex) { // 异步方法中的捕获 } }5. 集合与LINQ高效数据操作实战常用集合性能对比集合类型插入查找线程安全ListO(1)O(n)否DictionaryK,VO(1)O(1)否ConcurrentBagO(1)O(n)是LINQ查询示例var results products .Where(p p.Price 100) .OrderBy(p p.Category) .Select(p new { p.Name, p.Price });性能优化技巧对大数据集使用AsParallel()多次使用的查询结果用ToList()缓存避免在循环中重复执行LINQ查询表达式树高级应用ExpressionFuncProduct, bool expr p p.Price 100; // 可动态解析修改表达式树6. 异步编程从Task到ValueTask基础async/await模式async Taskint FetchDataAsync() { var data await httpClient.GetStringAsync(url); return ProcessData(data); }关键概念Task表示异步操作await异步等待点ConfigureAwait(false)避免上下文切换ValueTask优化async ValueTaskint GetCachedData() { if (cache.TryGetValue(key, out var data)) return data; // 同步返回 return await FetchFromNetworkAsync(); // 异步路径 }常见陷阱忘记await导致异常被吞没死锁.Result或.Wait()在UI线程调用异步构造函数问题可用工厂方法解决7. 反射与源码生成动态与静态的平衡基础反射示例Type type typeof(MyClass); object instance Activator.CreateInstance(type); MethodInfo method type.GetMethod(Process); method.Invoke(instance, new object[] { param });性能优化方案缓存反射结果如Type对象使用ExpressionTree动态生成代码用System.Reflection.Emit直接IL生成源码生成器C# 9[Generator] public class MyGenerator : ISourceGenerator { public void Execute(GeneratorExecutionContext context) { // 编译时生成代码 } }应用场景ORM实体类生成DI容器注册协议序列化代码8. 设计模式C#特色实现单例模式线程安全版public sealed class Singleton { private static readonly LazySingleton _instance new LazySingleton(() new Singleton()); public static Singleton Instance _instance.Value; private Singleton() { } }工厂模式与DI结合interface IServiceFactory { IService Create(); } class ServiceFactory : IServiceFactory { private readonly IServiceProvider _provider; public ServiceFactory(IServiceProvider provider) { _provider provider; } public IService Create() _provider.GetRequiredServiceIService(); }C#特有模式用using实现Disposable模式用yield return实现迭代器模式用async/await实现异步编程模式9. 最新特性C# 12实战技巧主构造函数C# 12public class Person(string name, int age) { public string Name { get; } name; public int Age age; }集合表达式int[] numbers [1, 2, 3, 4]; Liststring names [Alice, Bob];性能改进内联数组InlineArray拦截器实验性功能改进的泛型数学支持10. 调试与诊断生产环境问题排查内存诊断工具dotnet-dump收集内存快照Visual Studio内存分析器PerfView分析内存泄漏性能计数器using var listener new DiagnosticListener(MyApp); using var meter new Meter(MyMeter); var counter meter.CreateCounterint(Requests); counter.Add(1);日志记录最佳实践结构化日志如Serilog合理设置日志级别使用Activity实现分布式追踪11. 跨平台开发.NET Core实战平台特定代码if (OperatingSystem.IsWindows()) { // Windows特有实现 } else if (OperatingSystem.IsLinux()) { // Linux实现 }文件路径处理string path Path.Combine(folder, file.txt); // 跨平台路径拼接依赖注入跨平台配置Host.CreateDefaultBuilder() .ConfigureServices((ctx, services) { if (ctx.HostingEnvironment.IsDevelopment()) { services.AddTransientIService, MockService(); } else { services.AddTransientIService, RealService(); } });12. 安全编程从输入验证到加密输入验证原则白名单优于黑名单边界检查如字符串长度使用正则表达式验证格式密码哈希示例string HashPassword(string password) { using var deriveBytes new Rfc2898DeriveBytes( password, saltSize: 16, iterations: 10000); byte[] salt deriveBytes.Salt; byte[] hash deriveBytes.GetBytes(20); return ${Convert.ToBase64String(salt)}:{Convert.ToBase64String(hash)}; }安全通信要点始终使用HTTPS正确配置TLS禁用旧版本证书验证防止中间人攻击13. 性能优化从基准测试到实际提升BenchmarkDotNet示例[MemoryDiagnoser] public class StringBenchmarks { [Benchmark] public string StringConcat() Hello World; [Benchmark] public string StringBuilder() new StringBuilder().Append(Hello).Append( ).Append(World).ToString(); }优化技巧避免装箱如用泛型集合使用SpanT减少内存分配对象池化ArrayPoolT垃圾回收调优服务器GC模式大内存应用限制Gen 0大小避免大对象分配14. 测试驱动开发从单元测试到集成测试xUnit测试示例public class CalculatorTests { [Theory] [InlineData(1, 2, 3)] [InlineData(-1, 1, 0)] public void Add_ReturnsCorrectSum(int a, int b, int expected) { var calc new Calculator(); var result calc.Add(a, b); Assert.Equal(expected, result); } }测试金字塔原则70%单元测试快速反馈20%集成测试组件交互10%UI/E2E测试完整流程Mock框架Moqvar mock new MockIRepository(); mock.Setup(r r.GetById(It.IsAnyint())) .Returns(new Product()); var service new ProductService(mock.Object);15. 微服务架构.NET生态实践gRPC服务定义service ProductService { rpc GetProduct (ProductRequest) returns (ProductResponse); } message ProductRequest { int32 id 1; } message ProductResponse { int32 id 1; string name 2; double price 3; }健康检查配置builder.Services.AddHealthChecks() .AddCheckDatabaseHealthCheck(database) .AddUrlGroup(new Uri(http://external-service), external);弹性策略Pollybuilder.Services.AddHttpClientIMyClient, MyClient() .AddTransientHttpErrorPolicy(policy policy.WaitAndRetryAsync(3, _ TimeSpan.FromSeconds(1)));16. 领域驱动设计复杂业务建模实体与值对象public class Order : EntityGuid { private readonly ListOrderItem _items new(); public IReadOnlyCollectionOrderItem Items _items.AsReadOnly(); public void AddItem(Product product, int quantity) { _items.Add(new OrderItem(product, quantity)); } } public record OrderItem(Product Product, int Quantity); // 值对象领域事件实现public interface IDomainEvent { } public class OrderPlaced : IDomainEvent { public Guid OrderId { get; } public DateTime OccurredOn { get; } DateTime.UtcNow; } public class Order : EntityGuid { private readonly ListIDomainEvent _events new(); public IReadOnlyCollectionIDomainEvent Events _events.AsReadOnly(); public void Place() { _events.Add(new OrderPlaced(Id)); } }仓储模式public interface IRepositoryT where T : IAggregateRoot { TaskT GetByIdAsync(Guid id); Task AddAsync(T entity); Task UpdateAsync(T entity); } public class OrderRepository : IRepositoryOrder { private readonly DbContext _context; public OrderRepository(DbContext context) { _context context; } public async TaskOrder GetByIdAsync(Guid id) { return await _context.Orders .Include(o o.Items) .FirstOrDefaultAsync(o o.Id id); } }17. 前端集成Blazor全栈开发Blazor组件示例page /counter inject ILoggerCounter Logger h1Counter/h1 pCurrent count: currentCount/p button classbtn btn-primary onclickIncrementCountClick me/button code { private int currentCount 0; private void IncrementCount() { currentCount; Logger.LogInformation($Count incremented to {currentCount}); } }JavaScript互操作public class JsInterop : IAsyncDisposable { private readonly IJSRuntime _jsRuntime; private IJSObjectReference? _module; public JsInterop(IJSRuntime jsRuntime) { _jsRuntime jsRuntime; } public async ValueTaskstring Prompt(string message) { _module ?? await _jsRuntime.InvokeAsyncIJSObjectReference( import, ./jsInterop.js); return await _module.InvokeAsyncstring(showPrompt, message); } public async ValueTask DisposeAsync() { if (_module is not null) { await _module.DisposeAsync(); } } }状态管理方案组件内状态局部变量级联参数跨组件传递状态容器类似Redux持久化存储LocalStorage18. 云原生开发Kubernetes部署实战Dockerfile示例FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY [MyApp.csproj, .] RUN dotnet restore MyApp.csproj COPY . . RUN dotnet build MyApp.csproj -c Release -o /app/build FROM build AS publish RUN dotnet publish MyApp.csproj -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --frompublish /app/publish . ENTRYPOINT [dotnet, MyApp.dll]K8s部署文件apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myregistry/myapp:latest ports: - containerPort: 80 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi健康检查配置builder.Services.AddHealthChecks() .AddCheck(self, () HealthCheckResult.Healthy()); app.MapHealthChecks(/health, new HealthCheckOptions { Predicate _ true, ResponseWriter UIResponseWriter.WriteHealthCheckUIResponse });19. 物联网开发.NET NanoFramework实战GPIO控制示例using System.Device.Gpio; using System.Threading; var gpio new GpioController(); gpio.OpenPin(2, PinMode.Output); while (true) { gpio.Write(2, PinValue.High); Thread.Sleep(500); gpio.Write(2, PinValue.Low); Thread.Sleep(500); }传感器数据读取var i2cDevice new I2cDevice(new I2cConnectionSettings(1, 0x48)); var sensor new Bme280(i2cDevice); while (true) { var temp sensor.ReadTemperature(); var humidity sensor.ReadHumidity(); Debug.WriteLine($Temp: {temp.DegreesCelsius}°C, Humidity: {humidity.Percent}%); Thread.Sleep(2000); }设备通信协议MQTT轻量级发布/订阅AMQP企业级消息队列CoAP受限设备协议20. 人工智能ML.NET实战应用情感分析模型var context new MLContext(); var data context.Data.LoadFromTextFileSentimentData( data.csv, separatorChar: ,); var pipeline context.Transforms.Text.FeaturizeText(Features, nameof(SentimentData.Text)) .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression()); var model pipeline.Fit(data); var predictionEngine context.Model.CreatePredictionEngineSentimentData, SentimentPrediction(model); var sample new SentimentData { Text This is great! }; var prediction predictionEngine.Predict(sample); Console.WriteLine($Prediction: {(prediction.Prediction ? Positive : Negative)});图像分类流程使用Model Builder生成初始模型迁移学习基于预训练模型自定义TensorFlow/Keras模型集成模型部署选项本地嵌入直接引用Web API服务ASP.NET CoreONNX运行时跨平台推理