C#通用常见面试题-精心整理

以下是优化后的版本,在原有内容基础上补充了应用场景,其他结构保持不变:


上位机面试题解答(技术详解+示例)


C#-IOC框架

1. 值类型和引用类型的本质区别

解释
  • 值类型:存储在栈中,直接保存数据值(如 int, struct)。
  • 引用类型:存储在堆中,变量保存对象地址(如 class, string)。
对比表格
特性 值类型 引用类型
存储位置 栈(Stack) 堆(Heap)
赋值行为 复制数据本身 复制对象地址
默认值 0或false(根据类型) null
装箱/拆箱 支持(值类型转为对象) 不适用
应用场景
  • 值类型:适合存储轻量级数据(如传感器数值、坐标),避免频繁堆内存分配。
  • 引用类型:管理复杂对象(如设备连接、数据库上下文),支持多处共享引用。
示例
int temperature = 25; // 值类型(传感器数据)
Device device = new Device(); // 引用类型(设备对象)

2. 抽象类和接口的区别

解释
  • 抽象类:可包含方法实现、字段和构造函数,支持单继承。
  • 接口:仅定义方法签名,支持多继承,无实现。
对比表格
特性 抽象类 接口
方法实现 可有具体实现或抽象方法 仅定义方法签名(C# 8.0后支持默认实现)
继承规则 单继承 多继承
构造函数 支持 不支持
适用场景 共同实现逻辑(如 Animal 基类) 行为契约(如 IPlayable 接口)
应用场景
  • 抽象类:物联网设备驱动开发中,定义基础通信逻辑(如 AbstractModbusDevice)。
  • 接口:定义跨平台协议(如 ICommunicationProtocol),支持 Modbus, OPC UA 等多协议实现。
    可以包含抽象成员:
    抽象类可以包含抽象方法、抽象属性等,这些成员没有具体的实现,必须由派生类实现。
    可以包含非抽象成员:
    抽象类也可以包含普通的方法、属性、字段等,这些成员可以直接在抽象类中实现。
示例
// 抽象类
public abstract class BaseDevice {
   
    protected void Connect() {
    /* 共享连接逻辑 */ }
    public abstract void ReadData(); 
}

// 接口
public interface IProtocol {
   
    void SendCommand(string cmd);
}

3. 委托和事件的区别

解释
  • 委托:封装方法引用,支持多播。
  • 事件:委托的封装,提供访问控制(仅发布者可触发)。
对比表格
特性 委托 事件
访问控制 无限制(可被任何代码调用) 通过 event 关键字保护
多播支持 支持 支持
适用场景 一般方法调用 事件驱动场景(如按钮点击)
应用场景
  • 委托:实现回调函数(如异步任务完成时的 TaskCompletionSource)。
  • 事件:设备状态变化通知(如 Device.OnDataReceived)。
示例
public event EventHandler<DataReceivedEventArgs> OnDataReceived;
// 触发事件
OnDataReceived?.Invoke(this, new DataReceivedEventArgs(buffer));

4. IOC依赖注入的注入方式

解释
  • 构造函数注入:通过构造函数传递依赖。
  • 属性/方法注入:通过属性或方法设置依赖(较少使用)。
对比表格
方式 构造函数注入 属性注入 方法注入
推荐程度 强烈推荐 不推荐 不推荐
可维护性 高(显式声明依赖) 低(隐藏依赖)
适用场景 99%的场景 避免使用 避免使用
应用场景
  • 构造函数注入:云服务中注入数据库上下文(如 MyService(IService service))。
  • 属性注入:遗留代码中快速集成第三方库(需谨慎使用)。
示例
public class DeviceService {
   
    private readonly ICommunication _comm;
    public DeviceService(ICommunication comm) {
    // 显式依赖
        _comm = comm;
    }
}

5. C#集合简单介绍

解释
  • List:动态数组,适合随机访问和遍历。
  • Dictionary:哈希表,快速查找键值对。
  • LinkedList:链表结构,插入删除高效。
对比表格
集合类型 增删效率 查找效率 线程安全 适用场景
List 低(O(n)) 高(O(1)) 频繁遍历,少量增删
Dictionary 中(O(1)) 高(O(1)) 频繁按键查找(如设备ID映射)
LinkedList 高(O(1)) 低(O(n)) 频繁插入/删除(如队列)
应用场景
  • List:存储设备列表(如 List)。
  • Dictionary:设备ID到实例的映射(如 Dictionary)。
示例
var devices = new List<Device>(); // 设备列表
var deviceMap = new Dictionary<string, Device>(); // 快速查找

6. C#垃圾回收机制&#x

你可能感兴趣的:(c#,开发语言)