1

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 字典。用户会经常使用函数的模板版本,但也经常使用非模板版本。当使用非模板版本时,它们会引发虚函数调用以及装箱/拆箱。

我想知道它是否值得。有什么意见吗?

4

0 回答 0