C#泛型RequestQueue类:Add方法参数赋值及请求添加问题
问题核心解决方案
你需要在RaiseRequest方法中传入当前对象实例(this),或者创建一个新的Department/Employee实例作为请求实体。原代码中deptTicket/empTicket字段未初始化,默认值为null,导致队列中无法存入有效内容。
修改后的关键代码
Department类
public class Department { public bool RaiseRequest() { // 传入当前Department实例作为有效请求 return Helpdesk.DepQueue.Add(this); } }
Employee类
public class Employee { public bool RaiseRequest() { // 传入当前Employee实例作为有效请求 return Helpdesk.EmpQueue.Add(this); } }
额外修复代码中的严重Bug
原RequestQueue<T>类存在两个致命问题,会导致队列逻辑混乱,需要同步修正:
pointer是静态字段,会让所有队列实例共享同一个指针(比如部门队列和员工队列的指针互相干扰),需改为实例字段ProcessItem方法中创建的newArray是int[],与泛型数组类型不匹配,需改为T[]
修改后的RequestQueue<T>类:
public class RequestQueue<T> { private T[] listOfRequest; // 改为实例字段,每个队列独立维护指针 private int pointer; public RequestQueue(int size) { this.listOfRequest = new T[size]; pointer = 0; } public bool Add(T tRef) { if(pointer < this.listOfRequest.Length) { this.listOfRequest[pointer] = tRef; pointer += 1; return true; } else { return false; } } public bool ProcessItem() { if(pointer > 0) { // 创建同类型的泛型数组 var newArray = new T[this.listOfRequest.Length]; // 将后续元素前移,移除第一个请求 Array.Copy(this.listOfRequest, 1, newArray, 0, pointer - 1); this.listOfRequest = newArray; pointer -= 1; return true; } else { return false; } } }
逻辑说明
- 传入
this的原因:调用RaiseRequest的Department/Employee对象本身就是一个有效的请求实体,队列存储该对象引用后,后续处理请求时可以直接获取对应实体的信息。 - 指针与数组修复:确保每个队列独立管理自己的请求数量和存储数组,避免不同类型队列之间的逻辑干扰。
内容的提问来源于stack exchange,提问作者Varun Gupta
相关产品推荐
相关产品推荐

