.NET基础面试题及答案详解

92 阅读7分钟

一、C#语言特性

  1. 值类型与引用类型的区别?装箱与拆箱的过程是怎样的?

    • 值类型(如intstruct)存储在栈上,直接包含数据,生命周期由作用域管理。
    • 引用类型(如classstring)存储在堆上,栈中保存引用地址,需通过new创建,生命周期由垃圾回收器(GC)管理。
    • 装箱:将值类型转换为引用类型(如object o = 123;)。
    • 拆箱:将引用类型转换回值类型(如int i = (int)o;)。
  2. 接口与抽象类的异同?如何选择使用?

    • 相同点:均无法直接实例化,可包含未实现的方法。

    • 不同点

      • 接口支持多继承,抽象类仅支持单继承。
      • 接口定义规范(仅有方法签名),抽象类可包含具体实现。
    • 选择:需多继承规范时用接口,需共享代码或状态时用抽象类。

  3. 委托与事件在C#中的作用及实现原理?

    • 委托:类似函数指针,用于封装方法调用(如delegate void MyDelegate(string s);)。
    • 事件:基于委托,提供发布-订阅模型(如public event EventHandler MyEvent;)。
    • 原理:事件本质是封装了委托的属性,确保外部只能订阅或取消订阅,不能直接触发。
  4. constreadonly的关键区别及应用场景?

    • const:编译时常量,必须在声明时初始化,值不可变(如const int MAX = 100;)。
    • readonly:运行时常量,可在构造函数中初始化,值不可变(如readonly DateTime _birthDate;)。
    • 场景const用于固定值,readonly用于依赖外部数据的常量。
  5. 泛型的主要约束和次要约束是什么?举例说明。

    • 主要约束where T : class(引用类型)、where T : struct(值类型)、where T : new()(有公共无参构造函数)。
    • 次要约束where T : IComparable(实现接口)、where T : MyClass(继承自特定类)。
    • 示例public class List<T> where T : IComparable { ... }

二、.NET框架核心

  1. CLR(公共语言运行库)的核心功能有哪些?

    • 内存管理(自动垃圾回收)。
    • 代码执行(编译IL为机器码)。
    • 类型安全验证。
    • 异常处理与线程管理。
  2. BCL(基类库)中常用的命名空间及其作用?

    • System:基础类型(如StringInt32)。
    • System.Collections.Generic:泛型集合(如List<T>Dictionary<TKey, TValue>)。
    • System.Linq:LINQ查询操作。
    • System.Threading:多线程与异步编程。
  3. 解释IL(中间语言)在.NET编译过程中的作用。

    • C#代码编译为IL(中间语言),存储在程序集(.exe/.dll)中。
    • CLR在运行时将IL编译为平台特定机器码(JIT编译),实现跨平台兼容性。
  4. 垃圾回收(GC)机制如何工作?如何优化性能?

    • 工作原理:标记-清除算法,分代回收(第0代短期对象,第1/2代长期对象)。
    • 优化:避免大对象分配在短期代,手动释放非托管资源(实现IDisposable)。
  5. 什么是应用程序域(AppDomain)?其作用是什么?

    • 独立的内存空间,用于隔离应用程序。
    • 作用:动态加载/卸载程序集,提高安全性与稳定性。

三、ASP.NET Core

  1. ASP.NET Core与ASP.NET的主要区别及优势?

    • 跨平台:支持Windows、Linux、macOS。
    • 模块化:依赖注入内置,中间件管道灵活。
    • 性能:基于Kestrel服务器,更高吞吐量。
  2. MVC架构在ASP.NET Core中的实现及优势?

    • 实现

      • Model:数据与业务逻辑。
      • View:用户界面(Razor视图)。
      • Controller:处理请求与路由。
    • 优势:职责分离,易于测试与维护。

  3. 依赖注入(DI)在ASP.NET Core中的工作原理及优势?

    • 原理:在Startup.cs中注册服务,通过构造函数注入依赖。
    • 优势:解耦组件,提高可测试性(支持模拟对象)。
  4. 中间件(Middleware)的作用及配置方法?

    • 作用:处理HTTP请求与响应(如日志、异常处理)。
    • 配置:在Configure方法中使用app.Use()添加中间件。
  5. 如何配置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")。

四、数据库访问

  1. ADO.NET中的核心对象及其作用?

    • Connection:建立数据库连接。
    • Command:执行SQL命令或存储过程。
    • DataReader:高效读取数据流(只进、只读)。
    • DataSet:内存中的数据缓存,支持离线操作。
  2. Entity Framework与LINQ to SQL的区别及适用场景?

    • EF:支持复杂模型与迁移,适合企业级应用。
    • LINQ to SQL:轻量级,适合简单查询。
  3. 如何防止SQL注入攻击?举例说明。

    • 方法:使用参数化查询(如EF的Parameter.AddWithValue)。

    • 示例

      csharp
      	using (var command = new SqlCommand("SELECT * FROM Users WHERE Id = @Id", conn)) {
      
      	    command.Parameters.AddWithValue("@Id", userId);
      
      	}
      
  4. 数据库连接池的作用及配置方法?

    • 作用:复用数据库连接,减少开销。
    • 配置:在连接字符串中设置Pooling=true; Max Pool Size=100;
  5. 什么是延迟执行(Deferred Execution)在LINQ中的体现?

    • 定义:查询在枚举时才执行(如foreach循环)。

    • 示例

      csharp
      	var query = db.Users.Where(u => u.Age > 18); // 仅定义查询
      
      	foreach (var user in query) { ... } // 此时才执行SQL
      

五、多线程与异步编程

  1. 线程与进程的区别?Windows单个进程的最大内存限制?

    • 线程:进程内的执行单元,共享进程资源。
    • 进程:资源分配的最小单位,包含多个线程。
    • 内存限制:32位系统为2GB,64位系统为8TB(实际受物理内存限制)。
  2. TaskThread的区别及适用场景?

    • Thread:低级API,需手动管理线程生命周期。
    • Task:高级API,基于线程池,支持异步与取消。
    • 场景:短期并行任务用Parallel.For,长期任务用Task.Run
  3. async/await关键字的作用及实现原理?

    • 作用:简化异步编程,避免阻塞主线程。
    • 原理:编译器将方法拆分为状态机,通过await释放线程,完成时恢复执行。
  4. 如何处理线程同步问题?锁(Lock)与监视器(Monitor)的区别?

    • 锁(lock :语法糖,内部使用Monitor.Enter/Exit
    • 监视器(Monitor :提供更细粒度控制(如Pulse/Wait)。
  5. 什么是线程池(ThreadPool)?其优势是什么?

    • 定义:预先创建的线程集合,用于执行短期任务。
    • 优势:减少线程创建/销毁开销,提高性能。

六、设计模式与架构

  1. 单例模式、工厂模式、观察者模式在.NET中的实现及应用?

    • 单例模式

      csharp
      	public sealed class Singleton {
      
      	    private static readonly Singleton _instance = new Singleton();
      
      	    private Singleton() { }
      
      	    public static Singleton Instance => _instance;
      
      	}
      
    • 工厂模式:通过方法创建对象(如Abstract Factory)。

    • 观察者模式:事件与委托实现(如EventHandler)。

  2. 什么是DDD(领域驱动设计)?其核心概念有哪些?

    • 定义:以业务领域为核心的设计方法。
    • 核心概念:聚合(Aggregate)、仓储(Repository)、领域事件(Domain Event)。
  3. 微服务架构在.NET中的实现及挑战?

    • 实现:使用ASP.NET Core Web API,结合Docker与Kubernetes部署。
    • 挑战:分布式事务、服务间通信(如gRPC)、监控与日志。
  4. 如何设计一个可扩展、高可用的.NET应用架构?

    • 分层架构:UI层、应用层、领域层、基础设施层。
    • 缓存:使用Redis缓存热点数据。
    • 负载均衡:通过Nginx或Azure Load Balancer分发流量。
  5. 什么是ABP框架?其核心模块及优势?

    • 定义:开源的ASP.NET Boilerplate框架,简化企业级应用开发。
    • 核心模块:领域层、应用层、UI层、基础设施层。
    • 优势:内置权限验证、异常处理、审计日志等功能。

七、其他关键问题

  1. 字符串处理:stringStringBuilder的区别及性能优化?

    • string:不可变,频繁修改会生成新对象。
    • StringBuilder:可变,适合高频拼接操作。
  2. 异常处理:try/catch/finally的最佳实践及性能考虑?

    • 实践:捕获特定异常(如SqlException),避免空catch块。
    • 性能:异常处理成本高,应避免在正常流程中使用。
  3. 序列化与反序列化在.NET中的实现及应用?

    • 实现:使用JsonSerializer(.NET Core 3.0+)或Newtonsoft.Json
    • 应用:Web API通信、配置文件读写。
  4. 什么是强类型(Strong Typing)与弱类型(Weak Typing)?

    • 强类型:变量类型在编译时确定(如C#)。
    • 弱类型:变量类型可在运行时改变(如JavaScript)。
  5. 如何部署和配置一个.NET应用?包括IIS和Kestrel的配置差异?

    • IIS:通过Web Deploy发布,支持Windows身份验证。
    • Kestrel:内置跨平台服务器,需配合反向代理(如Nginx)使用。