C#方法调用时对比新旧参数的实现方案咨询
实现思路与解决方案
核心逻辑很简单:保存上一次调用的参数值,每次新调用方法时,先把当前传入的参数和历史值对比,再更新历史值即可。下面是几种实用的实现方式:
1. 基础实现:用私有字段存历史参数
适合单线程调用的场景,直接在类里加两个私有字段记录上次的参数值:
public class YourInstrumentService { // 用业务中不可能出现的数值当初始值(比如仪器剩余数不会是-1),第一次调用时直接判定为变化 private int _lastSamplesRemaining = -1; private int _lastInjectionsRemaining = -1; public bool SampleQueueChanged(int samplesRemainingInQueue, int injectionsRemainingInQueue) { // 对比本次和上次的参数,判断是否有变化 bool hasChanged = samplesRemainingInQueue != _lastSamplesRemaining || injectionsRemainingInQueue != _lastInjectionsRemaining; // 更新历史参数为本次的值 _lastSamplesRemaining = samplesRemainingInQueue; _lastInjectionsRemaining = injectionsRemainingInQueue; // 返回变化结果,也可以在这里直接执行参数变化后的业务逻辑 return hasChanged; } }
2. 扩展性方案:封装参数对象
如果后续可能新增参数,把参数封装成一个独立类,对比逻辑会更清晰,也方便扩展:
// 封装队列参数的类,集中管理所有参数 public class QueueParameters { public int SamplesRemaining { get; set; } public int InjectionsRemaining { get; set; } // 重写Equals方法,方便直接对比两个参数对象是否一致 public override bool Equals(object obj) { if (obj is QueueParameters other) { return SamplesRemaining == other.SamplesRemaining && InjectionsRemaining == other.InjectionsRemaining; } return false; } // 重写GetHashCode,和Equals逻辑保持一致(必须配套重写) public override int GetHashCode() { return HashCode.Combine(SamplesRemaining, InjectionsRemaining); } } public class YourInstrumentService { private QueueParameters _lastQueueParams = null; public bool SampleQueueChanged(int samplesRemainingInQueue, int injectionsRemainingInQueue) { var currentParams = new QueueParameters { SamplesRemaining = samplesRemainingInQueue, InjectionsRemaining = injectionsRemainingInQueue }; bool hasChanged; // 第一次调用时没有历史参数,直接判定为变化 if (_lastQueueParams == null) { hasChanged = true; } else { hasChanged = !currentParams.Equals(_lastQueueParams); } _lastQueueParams = currentParams; return hasChanged; } }
3. 线程安全版本
如果这个方法可能被多个线程同时调用(比如仪器数据是异步获取的),需要加锁保证参数读取和更新的原子性,避免状态混乱:
public class YourInstrumentService { private int _lastSamplesRemaining = -1; private int _lastInjectionsRemaining = -1; // 专用锁对象,保证线程安全 private readonly object _lockObj = new object(); public bool SampleQueueChanged(int samplesRemainingInQueue, int injectionsRemainingInQueue) { bool hasChanged; // 加锁后,同一时间只有一个线程能执行对比和更新操作 lock (_lockObj) { hasChanged = samplesRemainingInQueue != _lastSamplesRemaining || injectionsRemainingInQueue != _lastInjectionsRemaining; _lastSamplesRemaining = samplesRemainingInQueue; _lastInjectionsRemaining = injectionsRemainingInQueue; } return hasChanged; } }
内容的提问来源于stack exchange,提问作者destroyer
相关产品推荐
相关产品推荐

