我继承了用c#编写的旧队列系统。它的核心只是一个像这样定义的代表列表:
public delegate void QueuedEventDelegate();
struct QueuedEvent
{
public QueuedEventDelegate fn;
}
List<QueuedEvent> queuedEvents = new List<QueuedEvent>();
public void QueueFunction(QueuedEventDelegate delegate)
{
QueuedEvent q;
q.fn = delegate;
queuedEvents.Add(q);
}
public void ExecuteQueue()
{
foreach(var item in queuedEvents)
{
item.fn();
}
}
在我的代码的另一部分,我在for循环中使用此设置,其中添加排队事件以导出材料。 :
foreach(var material in skinnedMeshRenderer.sharedMaterials)
{
QueueFunction(()=>ExportMesh.ExportMaterial(material));
}
稍后我打电话给
ExecuteQueue();
我面临的问题是,当执行委托时,参数被解释为调试器中的目标,并且在稍后的循环迭代中引用对象。来自具有非常基本的C#经验的C ++背景对我来说似乎不寻常,但我的猜测是,即将进行的循环迭代正在编辑引用指向的对象作为委托中的参数。我不知道为什么会这样,我也很惊讶代码编译,因为我排队的函数与委托类型的定义不匹配。我对对象所有者船出了什么问题?为什么将上面例子中的这样一个函数传递给像上面那样的委托是合法的?