黑板是一个在运行时存储和获取通用键值对的对象。它可以通过Dictionary<object,object>
实现。一些子系统将信息写入黑板,以便其他子系统从中读取。
存储黑板的系统不知道其中的对象类型及其何时存在。每个针对特定键的写入者和读取者总是知道并同意键值对的类型。为了实现方便而牺牲了编译时检查 - 有大量的写入者和读取者,并且它们不断迭代。
我的黑板接口如下:
interface Blackboard {
bool HasKey(object key);
T GetValue<T>(object key);
}
作家创建并返回黑板,因此
SetValue(key, value)
可以是实现细节。我的初始实现使用了
Dictionary<object,object>
,一切都很好。然而,这个黑板必须快速且无需分配内存。这是不可协商的。如果作家将一个浮点值推入黑板中,那么天真的实现会将整数装箱放入字典中。我不能在实现类上使用通用类型
BlackboardImpl<ValueType> : Blackboard
,因为值类型在黑板之间不是常量。我可以使用多个内部字典,如
Dictionary<object,float>
、Dictionary<object,int>
等,带有后备Dictionary<object,object>
和许多SetValue函数,因此现在我在插入时不再进行装箱。然而,由于GetValue函数来自接口,我无法对其进行约束,因此仍然在退出时进行装箱:T GetValue<T>(object key) {
if (typeof(T) == typeof(int)) {
// return intStore[key]; // doesn't compile
return (T)(object)intStore[key]; // boxes, allocates, bad.
}
// ...
}
有没有什么语法技巧可以避免装箱,包括更改黑板界面?任何反射黑科技都将违反“快速”要求,即使您可以在不分配内存的情况下实现它。
干杯。
void*
和unsafe
吗? - rhughes