我正在制作一个XNA游戏,每次更新时我会调用2到20次代码。我试过谷歌搜索,似乎这是半慢的,所以我只是想我会问有没有更快的方法来比较类型?
代码:
public Modifier this[Type type]
{
get
{
for (int i = 0; i < this.Count; i++)
{
if (this[i].GetType() == type)
{
return this[i];
}
}
throw new NotImplementedException("Fix this");
}
set
{
for (int i = 0; i < this.Count; i++)
{
if (this[i].GetType() == type)
{
this[i] = value;
}
}
if(System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
}
}
此代码位于继承自List的ModifierCollection类中。修饰符是粒子引擎的一部分。此外,我的游戏不是在我可以实际测试这个的条件,所以我不能测试这个,但这应该工作正确吗?
我读了一些关于RunTimeTypeHandles的内容,它应该更快,我应该使用吗?
编辑:我的目标是做到以下几点: (particleEffect["NameOfEmitter"].Modifiers[typeof(SomeCoolModifier)] as SomeCoolModifier).Variable = Value;
基本上我只想在运行时更改某些修改器的值。
编辑2:我刚刚意识到我可以将修改器的引用保存到我现在调用它的类:P如果我有5-10个修饰符但是应该删除这个问题,可能不是干净的代码。 / p>
答案 0 :(得分:4)
如果您不需要Type
公开的任何额外功能,并且您只关心类型之间的绝对相等 - 即,您不需要支持继承 - {{1这是进行此比较的最快方法。
但是,我真的会怀疑这不是你班级设计的弱点。除非你有令人信服的理由直接检查类型,否则最好在你的对象上暴露某种类型的值(可能是枚举)来代表它们,并对它进行比较。
答案 1 :(得分:0)
您可以将值存储在按类型而不是列表索引的字典中,这样您就不必每次都对列表进行O(n)迭代。
如评论中所述,这取决于n的大小,可能是微观优化。我建议您分析您的申请。
答案 2 :(得分:0)
如果您希望真正快速并且可以信任调用您的代码,请将索引器更改为只需要一个int。然后在调用者用于向列表中添加类型的任何方法(您没有显示)中,返回相应的int。这是一个更糟糕的API,但它意味着您不必进行任何循环或查找。