通过这些方法限制拳击值得吗?

时间:2013-03-24 20:24:43

标签: c# boxing

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

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

0 个答案:

没有答案