C# 3 ところで...だから私は自分の 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 のコピーを保持し、そこから値に直接アクセスできます。
だから私が見ているのは、これが頻繁に使用されるため、フレーム時間になると、絶え間ないボクシングとアンボックスが私を傷つけているということです.
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 の辞書も保持します。ユーザーはテンプレート化されたバージョンの関数を頻繁に使用しますが、テンプレート化されていないバージョンも頻繁に使用します。テンプレート化されていないバージョンを使用すると、仮想関数呼び出しとボックス化/ボックス化解除が誘発されます。
その価値があるかどうか疑問に思っています。ご意見はありますか?