以下是优化后的版本,在原有内容基础上补充了应用场景 ,其他结构保持不变:
上位机面试题解答(技术详解+示例)
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<TKey,TValue> :哈希表,快速查找键值对。LinkedList :链表结构,插入删除高效。
对比表格
集合类型 增删效率 查找效率 线程安全 适用场景 List<T>
低(O(n)) 高(O(1)) 否 频繁遍历,少量增删 Dictionary
中(O(1)) 高(O(1)) 否 频繁按键查找(如设备ID映射) LinkedList<T>
高(O(1)) 低(O(n)) 否 频繁插入/删除(如队列)
应用场景
List :存储设备列表(如 List<Device>
)。Dictionary :设备ID到实例的映射(如 Dictionary<string, Device>
)。
示例
var devices = new List< Device> ( ) ;
var deviceMap = new Dictionary< string , Device> ( ) ;
6. C#垃圾回收机制&#x