GetType()==输入性能

时间:2011-09-02 17:50:02

标签: c# types gettype

我正在制作一个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>

3 个答案:

答案 0 :(得分:4)

如果您不需要Type公开的任何额外功能,并且您只关心类型之间的绝对相等 - 即,您不需要支持继承 - {{1这是进行此比较的最快方法。

但是,我真的会怀疑这不是你班级设计的弱点。除非你有令人信服的理由直接检查类型,否则最好在你的对象上暴露某种类型的值(可能是枚举)来代表它们,并对它进行比较。

答案 1 :(得分:0)

您可以将值存储在按类型而不是列表索引的字典中,这样您就不必每次都对列表​​进行O(n)迭代。

如评论中所述,这取决于n的大小,可能是微观优化。我建议您分析您的申请。

答案 2 :(得分:0)

如果您希望真正快速并且可以信任调用您的代码,请将索引器更改为只需要一个int。然后在调用者用于向列表中添加类型的任何方法(您没有显示)中,返回相应的int。这是一个更糟糕的API,但它意味着您不必进行任何循环或查找。