C# 3 顺便说一句...所以我正在研究我的人工智能黑板。其中一部分是字符串名称到通用值(对象)的关联映射,现在该值存储为装箱值类型或转换为对象的字符串。
所以是这样的:
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 的副本并直接从那里访问值。
所以我看到的是不断的装箱和拆箱正在伤害我,当涉及到帧时间时,因为它被大量使用。
我想知道为 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 字典。用户会经常使用函数的模板版本,但也经常使用非模板版本。当使用非模板版本时,它们会引发虚函数调用以及装箱/拆箱。
我想知道它是否值得。有什么意见吗?