C#3 btw ...... 所以我在我的AI黑板上工作。其中一部分是关联映射,字符串名称为泛型值(对象),现在该值存储为盒装值类型或转换为对象的字符串。
这样的事情:
public class ContextEntry
{
public string name;
public object value;
}
public class BehaviorContext
{
public ContextEntry AddEntry<T>(string name, T value)
{
//checks to see if T is an allowed type, create a ContextEnetry
//and adds it to map, returning a reference to the added entry
}
public bool GetValue<T>(string name, ref T val)
{
//look for entry, if found, do an as check with T,
//and then unbox the entry value into T
//otherwise return false
}
public bool GetValue(string name, ref object val)
{
//same as GetValue<T> but with object instead
}
public bool SetValue<T>(string name, T val)
{
//look for entry, if found, do an as check with T,
//and then box T into the entry value
//otherwise return false
}
public bool SetValue(string name, object val)
{
//same as SetValue<T> but instead checks val type is compatible with entry
}
protected Dictionary<string, ContextEntry> m_EntryMap = new Dictionary<string, ContextEntry>();
}
对于那些添加条目的人,他们可以保留ContextEnty的副本并直接从那里访问该值。
所以我所看到的是持续拳击和unbox伤害了我,当涉及到帧时间时,因为它被大量使用。
我想知道为ContextEntry做这样的事情是否会更好。
public interface IContextEntry
{
string Name {get; set;}
bool SetObj(object o);
void GetObj(ref object o);
}
public class ContextEntry<T> : IContextEntry
{
public bool SetObj(object o) { //do a compatibility check then unbox into value }
public void GetObj(ref object o) { //box value into o }
public T value;
}
现在我将为每个允许类型保留一个单独的ContextEntry [T]字典,并且如果有人使用GetValue [T]或SetValue [T],则只搜索右边的字典。如果有人使用GetValue或SetValue,我还会保留IContextEntry的字典和所有条目。用户经常使用函数的模板化版本,但也经常使用非模板化版本。当使用非模板化版本时,它们会引发虚拟函数调用以及装箱/拆箱。
我想知道它是否值得。有什么意见吗?